Python 文本边缘之字形效果移除(或查找图像区域的主色)

Python 文本边缘之字形效果移除(或查找图像区域的主色),python,opencv,image-processing,bounding-box,zigzag,Python,Opencv,Image Processing,Bounding Box,Zigzag,我的目标是为下图绘制文本边界框。因为这两个区域的颜色不同,所以这应该很容易。我只需要选择与特定颜色值匹配的像素,过滤掉其他文本区域并运行凸包检测 但是,当我放大图像时,我注意到文本区域在边缘上具有锯齿形效果,因此我无法从上面的图像中轻松找到蓝色和绿色的两个颜色值 我想知道有没有一种方法可以消除锯齿效应,以确保每个短语的颜色一致?或者有没有办法确定每个文本区域的主色调 抗锯齿会使颜色在黑色背景下变亮或变暗,因此可以将颜色视为受灯光影响。在这种情况下,我们可以使用光不变的颜色空间来提取颜色 所以首先

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

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

我想知道有没有一种方法可以消除锯齿效应,以确保每个短语的颜色一致?或者有没有办法确定每个文本区域的主色调


抗锯齿会使颜色在黑色背景下变亮或变暗,因此可以将颜色视为受灯光影响。在这种情况下,我们可以使用光不变的颜色空间来提取颜色

所以首先转换为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)

一个可能的解决方案是对图像设置阈值,并将其用作对原始图像中彩色像素进行采样的遮罩。但是,结果可能不是您想要的,因为由于严重的抗锯齿,遮罩可能会丢失一些像素。另一个解决方案涉及通过聚类——这本质上是将相似的彩色像素分组成簇。然后可以使用一种统一的纯色重新绘制这些聚集的像素,有效地混淆字母。@stateMachine是的,我同意。当我有其他不同颜色的图像时,第一种解决方案可能无法很好地推广,因为我需要为每个图像选择合适的阈值。我认为第二个解决方案看起来很有希望。颜色和位置的组合可能适用于这种情况。这看起来很棒!非常感谢您的详细解释。我会投票接受你的答案。