更改特定颜色范围以在CV2或PIL中显示颜色

时间:2020-05-27 09:47:16

标签: python python-3.x opencv python-imaging-library

我的图片如下

在此图像中,我想将黄色数字转换为BLACK颜色,将RED区域转换为灰色。黑色和灰色区域不应更改。 我该怎么做?有人可以帮忙吗? 我看了几个问题,但我无法弄清楚。另外,由于黄色和红色两种颜色并不完全相同,而是在一定范围内,因此我无法直接替换这些颜色。 CV2或PIL都可以。

如果必须使用HSV值,请让我知道如何计算范围。已经提出了这个问题,并且已经有一些答案,但是我无法理解,所以任何其他指导都将有所帮助

enter image description here

我期望的输出类似于下面的图片(通过在Gimp中绘制像素来创建)。不完全是您所看到的,但是您知道我在寻找什么。

enter image description here

更新 我最终使用的解决方案如下。这使所有黄色字母变为黑色,这对我来说已经足够了(我认为,通过类似的方法,所有红色区域也可以变为灰色)

img = Image.open('Testpic.jpg').convert('RGB')

roi = img.crop((652,125,697,295))
orig_color1 = (210,140,0)
orig_color2 = (210,210,210)

replacement_color = (4,4,4)
roi = roi.resize((288, 1014), Image.ANTIALIAS)
data = np.array(roi)
data[((data >= orig_color2)).all(axis = -1)] = (255,0,0)
data[((data >= orig_color1)).all(axis = -1)] = replacement_color
data[((data == (255,0,0))).all(axis = -1)] = (255,255,255)

img2 = Image.fromarray(data, mode='RGB')

1 个答案:

答案 0 :(得分:2)

您的图像质量不是最好的,并且如果可以得到更好的输入,您的结果应该会得到改善。我只是展示一种使用 ImageMagick 的技术,如果有人喜欢的话,可以稍后将其转换为Python wand-这应该不太困难。

因此,在这种情况下,与其在HSL色彩空间中选择范围,不如将图像重新映射到特定调色板更容易,而且可能更好,因为您只想区分4种颜色。因此,我制作了以下4种颜色的调色板-像这样的黑色,灰色,黄色和红色:

magick xc:"gray(15)"  xc:"gray(178)" xc:"rgb(230,50,30)" xc:"rgb(230,190,90)"  +append palette.png

这使这个(大大放大了)的4x1调色板:

enter image description here

然后我将您的图像重新映射为该调色板的颜色:

magick column.png +dither -remap palette.png intermediate.png

enter image description here

然后,我将所有接近黑色的颜色替换为黑色,将所有接近红色的颜色替换为白色:

magick intermediate.png -fill black -fuzz 30% -opaque yellow -fill white -opaque red result.png

enter image description here

显然将-fill white更改为-fill "gray(180)" if you want the background uniform, or add阈值50%`:

enter image description here


如果由于某种原因不想使用wand,则可以使用my answer here量化到相同的特定4色调色板。

相关问题