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

问题描述 投票:1回答:1

我尝试用此脚本替换图像的单色。我需要为图像中的相似颜色重新着色。例如,我有一个蓝色,板岩蓝色。我想用红色为这两种颜色重新着色。但是正如我在下面提到的,我无法做到这一点。它可以在python的PIL或OpenCV库中。

此代码的来源:Change specific RGB color pixels to another color, in image file

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()
python image opencv graphics python-imaging-library
1个回答
0
投票

根据您对'类似颜色'的了解,您需要将蓝色及其变体转换为红色。我将为您提供在OpenCV中执行此操作的解决方案。使用cv2.inRange可以更轻松地在HSV色彩空间而不是RGB中分割颜色,以创建遮罩该颜色在该范围内的位置。

在创建一个掩码,因为其值为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]用作上限范围。

© www.soinside.com 2019 - 2024. All rights reserved.