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

我试过这个脚本来替换图像的单一颜色。我需要重新着色图像中的相似颜色。例如,我有一个蓝色,石板蓝。我想用红色重新着色这两种颜色。但正如我在下面提到的,我不能那样做。它可以在 PIL 或 Python 中的 OpenCV 库中。

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()


哆啦的时光机
浏览 65回答 1
1回答

慕姐8265434

根据我对您的“相似颜色” 的理解,您需要将蓝色及其变体转换为红色。我会给你一个在 OpenCV 中执行此操作的解决方案。在 HSV 颜色空间而不是 RGB 中分割颜色更容易,以创建颜色在该范围内的掩码cv2.inRange。在创建一个值为 255 和 0 的掩码后,我将其除以 255 以将其转换为 1 和 0,然后将其转换为布尔值。然后就像您在问题中显示的那样,只要掩码正确,就会放置新颜色。编码:import cv2import numpy as npimg = 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, 0mask = cv2.inRange(hsv, lower_green, upper_green)mask = mask/255mask = mask.astype(np.bool)res[:,:,:3][mask] = [b2, g2, r2] # opencv uses BGRcv2.imshow('image', img)cv2.imshow('Result', res)cv2.waitKey(0)cv2.destroyAllWindows()结果我转换了绿色,因为这张图片中的蓝色非常少。您可以将[100, 50, 50]其用作较低范围和[130, 255, 255]较高范围。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python