自定义(更改)图像(像素)颜色 - Python

5
我希望能够自定义图像颜色,制作出具有不同颜色变体的类似图像。
示例:

Logo_1 logo_2

对于上面的图像,我想用其他颜色(如蓝色、绿色、黄色、黑色等)替换红色。
我尝试过:
from PIL import Image
filename ="./Logo.jpg"

picture = Image.open(filename, 'r')
_colors = [(255, 255, 255), (128, 128, 0), (128, 128, 128), (192, 128, 0), (128, 64, 0), (0, 192, 0), (128, 64, 128), (255, 255, 255)]
width, height = picture.size

for x in range(0, width):
    for y in range(0, height):
        current_color = picture.getpixel((x,y))
        # print (current_color)
        if current_color in _colors:
            picture.putpixel((x,y), (255,5, 255))
            # print ("Y")

picture.save("./test/change.png")


上述代码是非常常见的代码,适用于大多数情况。 但它很难实现,因为它替换了列表 "_colors" 中的像素。 输出图像如下:

wrong Output

有没有解决上述问题的方案?有没有使用机器学习来处理这个问题的聪明方法?有没有使用另一种编程语言的解决方案?

1个回答

3

我不熟悉PIL,听说它处理速度较慢。因此,这里提供了一个基于OpenCV的版本:

# for red color, it's easier to work with negative image 
# since hue is in [170, 180] or [0,10]
hsv_inv = cv2.cvtColor(255-img, cv2.COLOR_BGR2HSV)

# these are cyan limit, but we're working on negative image, so...
lower_range = np.array([80,0,0])
upper_range = np.array([100,255,255])

# mask the red
mask = cv2.inRange(hsv_inv, lower_range, upper_range)

# replace red by green
green_hsv = hsv_inv.copy()
green_hsv[np.where(mask)] += np.array([60,0,0], dtype=np.uint8)    
green_img = 255 - cv2.cvtColor(green_hsv, cv2.COLOR_HSV2BGR)

purple_hsv = hsv_inv.copy()
purple_hsv[np.where(mask)] -= np.array([30,0,0], dtype=np.uint8)
purple_img = 255 - cv2.cvtColor(purple_hsv, cv2.COLOR_HSV2BGR)

请忽略ticks,因为它们是用matplotlib显示的。

绿色

紫色


请问您能否添加一些解释,告诉我需要更改哪些代码以更换其他颜色,例如如果我想用其他颜色替换绿色或蓝色? - Ujwala Patil
修改 green_hsv 的那一行会改变色调,也就是改变颜色。你需要改变色调的值才能得到不同的颜色,就像 purple_hsv 中展示的那样。 - Quang Hoang
是的,这会改变红色像素存在的颜色,但如果我想用其他颜色像素替换蓝色像素,我需要更改代码的哪个部分??? - Ujwala Patil
1
你需要将lower_rangeupper_range更改为极端色调。请注意,除了红色之外,请不要使用负颜色(255-img)。 - Quang Hoang
现在它适用于红色,绿色,黄色,橙色和粉色,但对于蓝色,黑色和白色不起作用。 - Ujwala Patil
它应该仍然能够在蓝色(HSV在正向图像上)下工作,而黑色和白色应该在V通道上进行阈值处理,而不是H。 黑色和白色也可以在原始BGR图像上进行阈值处理。例如,黑色可以是lower =(0,0,0),upper =(50,50,50),并在BGR上应用inRange - Quang Hoang

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