【问题标题】:Text edge zigzag effect removal (OR finding the dominant color for a image region)文本边缘锯齿形效果去除(或找到图像区域的主色)
【发布时间】:2021-08-11 04:54:11
【问题描述】:

我的目标是为下图绘制文本边界框。由于这两个区域的颜色不同,所以这应该很容易。我只需要选择匹配某个颜色值的像素来过滤掉其他文本区域并运行凸包检测。

但是,当我放大图像时,我注意到文本区域的边缘具有锯齿形效果,因此我无法从上图。

我想知道有没有办法消除之字形效果以确保每个短语的颜色一致?或者有没有办法确定每个文本区域的主色?

【问题讨论】:

  • 一种可能的解决方案是对图像进行阈值处理,并将其用作掩码来对原始图像中的彩色像素进行采样。但是,结果可能不是您想要的,因为由于抗锯齿过重,蒙版可能会丢失一些像素。另一种解决方案涉及Color Quantization 通过聚类 - 这基本上将相似颜色的像素分组到聚类中。然后可以使用一种统一的纯色重新绘制这些聚集的像素,从而有效地使字母混叠。
  • @stateMachine 是的,我同意。当我有其他颜色不同的图像时,第一个解决方案可能无法很好地概括,因为我需要为每个图像选择适当的阈值。我认为第二种解决方案看起来很有希望。颜色和位置的组合可能适用于这种情况。

标签: python opencv image-processing bounding-box zigzag


【解决方案1】:

抗锯齿使颜色变浅(如果在黑色背景下,颜色变深),因此您可以将颜色视为受光的影响。在这种情况下,我们可以使用光不变颜色空间来提取颜色。

所以首先转换为 hsv,因为它是一个光不变的色彩空间。由于背景可以是黑色或白色,我们将过滤掉它们(如果背景总是白色而文本可以是黑色,则需要更改过滤以允许这样做)。

我将饱和度设为小于 80,因为这将包含白色黑色和灰色,因为它们是唯一具有低饱和度的颜色。 (您的图像不是完全白色,它的 238 而不是 255 可能是由于 jpg 压缩)

由于我们找到了所有的黑色、白色和灰色,所以图像的其余部分是我们的主要颜色,所以我采用了滤镜的反向蒙版,然后为了使颜色均匀且不受光线影响,设置饱和度和值的颜色到 255,这样所有颜色之间的唯一区别就是色调。我还将 bg 像素设置为 0,以便更容易找到轮廓,但这不是必需的

在此之后,您可以使用任何您想要获得不同颜色组的方法,我只是对色调值做了一个快速直方图,得到了 3 个峰值,但 2 个很接近,因此可以将它们捆绑在一起作为 1。您可以也许使用峰值查找来尝试找到峰值。找到颜色组可能有更好的方法,但这是我很快想到的。

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask = hsv[:,:,1] < 80 # for white, gray & black
hsv[mask] = 0 # set bg pixels to 0
hsv[~mask,1:] = 255 # set fg pixels saturation and value to 255 for uniformity

colors = hsv[~mask]
z = np.bincount(colors[:,0])
print(z)

bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
cv2.imshow('bgr', bgr)

【讨论】:

  • 这看起来很棒!非常感谢您的详细解释。我会投票并接受你的回答。
猜你喜欢
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
相关资源
最近更新 更多