如何在Python中重新着色图像中的多个像素

3
我尝试了这个脚本,用于替换图像中的单色。我需要重新着色图像中类似的颜色。例如,我有一个蓝色和青灰色。我想用红色重新着色这两种颜色。但是如下所述,我不能这样做。它可以在Python的PIL或OpenCV库中实现。
代码来源: 更改图像文件中特定RGB颜色像素为另一种颜色
import numpy as np
from PIL import Image

image = Image.open('wall.jpg')
data = np.array(im)

r1, g1, b1 = 81, 90, 103 # Original value
r2, g2, b2 = 255, 0, 0 # Value that we want to replace it with

red, green, blue = data[:,:,0], data[:,:,1], data[:,:,2]
mask = (red == r1) & (green == g1) & (blue == b1)
data[:,:,:3][mask] = [r2, g2, b2]

im = Image.fromarray(data)
im.show()

你应该添加示例图片,并在修改后获取图片。 - undefined
顺便说一句:data[ (data == color1).all(axis=2) ] = color2 其中 color1 = 81, 90, 103color2 = 255, 0, 0 - undefined
1个回答

4
根据您的“相似颜色”的理解,您需要将蓝色及其变体转换为红色。我将为您提供一种在OpenCV中实现此目的的解决方案。在HSV颜色空间中进行颜色分割比RGB更容易,使用cv2.inRange创建一个掩膜来确定该范围内存在哪些颜色。
创建掩膜后,由于其值为255和0,我将其除以255以将其转换为1和0,然后将其转换为布尔型。像您在问题中展示的那样,无论掩膜在哪里都会放置新颜色。 代码:
import cv2
import numpy as np

img = cv2.imread('2.jpg')
res = img.copy()
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

lower_green = np.array([40,50,50])
upper_green = np.array([80,255,255])
r2, g2, b2 = 255, 0, 0

mask = cv2.inRange(hsv, lower_green, upper_green)

mask = mask/255
mask = mask.astype(np.bool)
res[:,:,:3][mask] = [b2, g2, r2] # opencv uses BGR

cv2.imshow('image', img)
cv2.imshow('Result', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

Result

我将绿色转换为蓝色,因为这张图片中蓝色很少。您可以使用[100, 50, 50]作为下限范围,[130, 255, 255]作为上限范围。

谢谢,Vardan,它运行得非常好。但是,如何将颜色转换为列表呢?例如,在代码中,你使用了[40,50,50][80,255,255]表示绿色。你能解释一下吗? - undefined
你可以在这篇文章中看到HSV图 https://medium.com/dataseries/designing-image-filters-using-opencv-like-abode-photoshop-express-part-1-8765e3f4495b。这将帮助你理解HSV颜色空间中数值的变化。 - undefined
如果你想找出你的图像的相关信息,我建议你保持第二个和第三个值不变,即50和255。要找到第一个值,你可以将图像中最暗和最亮的蓝色转换为HSV值,以找出色调的数值。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接