【问题标题】:How do i draw rectangle blocks on resized image?如何在调整大小的图像上绘制矩形块?
【发布时间】:2018-10-16 19:03:26
【问题描述】:

我有一些图像,我想从中识别文本块并在它们周围绘制矩形,但这些图像具有不同的尺寸,因此我已将它们调整为新尺寸,并且能够在文本周围绘制块。但之后我必须在这些块上应用 OCR,当我将图像调整为较低尺寸时,这些块文本变得模糊。

示例:将尺寸 (5847, 4134) 的图像调整为 (1000,700) 后 我能够绘制文本块,但是在获得这些块的坐标后,即使我乘以调整大小的图像的比例,它也没有显示像这样的确切块:

调整大小后的块

使用调整后图像的坐标在原始图像上绘制块

为了在原版上绘制积木,我做了这样的事情:

x, y, w, h = cv2.boundingRect(c)
    x = round(x*x_old/wid)
    y = round(y*y_old/hei)
    w = round(w*x_old/wid)
    h = round(h*y_old/hei)

这里 x_old 是原始高度 5874,y_old 是 4134,wid 是 1000,hei 是 700

【问题讨论】:

  • 在您的代码中,而不是将新值分配给 x,y,w,h 尝试将这些新计算值添加到以前的值中,例如 x += round()
  • 我认为你的宽度和高度以某种方式交换了。你能分享你所有的代码吗?它更容易理解。
  • @AnandCU 感谢您的帮助。是的,x_old 和 y_old 被交换了,但仍然不是那么准确,所以我将 round 函数移到了内部部门,从而解决了问题

标签: opencv image-processing ocr


【解决方案1】:

这更像是一个几何问题而不是 Opencv 问题。

假设您知道尺寸为 1000X1000 的图像的所有矩形,假设矩形是 rec1 = ([0,0],[100,100])rec2 = ([50,50],[90,90])([y1,x1],[y2,x2])

好的,现在让我们假设您有另一个形状为 1255X1300 的图像,并且您想在这个新图像中相对于旧图像绘制相同的矩形。

您需要做的是找到两个图像之间的 x 和 y 比率,并将这些比率应用于图像。或者你可以用相对的方式表达你的矩形。

计算比率:

要计算两个图像之间的比率,只需将其 x 和 y 维度相除:

x_ratio = x_new/x_old
y_ratio = y_new/y_old

在我们的例子中是:

x_ratio = 1.300 y_ratio = 1.255

现在您将这个比率应用于矩形并对其值进行四舍五入。您只需将矩形的 x 乘以 x_ratio 并将矩形的 y 乘以 y_ratio 并四舍五入(请记住,四舍五入会使它失去一点精度)

相对矩形:

您还可以通过划分其对应尺寸来表示相对于第一张图像的矩形。相对矩形应该是这样的:rel_rec1 = ([0.,0.],[0.1,0.1]), rel_rec2 = ([0.05,0.05],[0.09,0.09])

然后,要知道新图像中矩形的绝对值,只需将相对矩形乘以新图像的尺寸并四舍五入即可,例如

new_rec2 = ([0.05*1255,0.05*1300],[0.09*1255,0.09*1300])

希望对你有帮助

【讨论】:

  • 是的,这正是我所做的,以前我对 x 和 y 比率值感到困惑。现在,我开始工作了,正准备在这里写答案,但多亏了你,我不再需要了。谢谢你的详细解释。
最近更新 更多