1

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

在此处输入图像描述

但是,当我放大图像时,我注意到文本区域的边缘具有锯齿形效果,因此我无法从上面的图像中轻松找到两个颜色值(蓝色和绿色)。

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

在此处输入图像描述

4

1 回答 1

2

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

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

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

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

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

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)

在此处输入图像描述

于 2021-05-22T10:11:05.733 回答