【问题标题】:How to recolor multiple pixels in image - Python如何重新着色图像中的多个像素 - Python
【发布时间】:2020-09-18 08:58:42
【问题描述】:

我尝试使用此脚本替换图像的单一颜色。我需要在图像中重新着色相似的颜色。例如,我有蓝色,石板蓝。我想用红色重新着色这两种颜色。但正如我在下面提到的,我不能那样做。它可以在 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()

【问题讨论】:

  • 您应该添加示例图像,以及更改后获得的图像。
  • 顺便说一句:data[ (data == color1).all(axis=2) ] = color2 其中color1 = 81, 90, 103color2 = 255, 0, 0

标签: python image opencv graphics python-imaging-library


【解决方案1】:

根据我对您的'相似颜色'的理解,您需要将蓝色及其变体转换为红色。我会给你一个解决方案来在 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()

我转换了绿色,因为这张图片中的蓝色非常少。您可以使用[100, 50, 50] 作为下限,[130, 255, 255] 作为上限。

【讨论】:

  • 谢谢,Vardan 效果很好。但是,如何将颜色转换为列表?例如在代码中,您使用[40,50,50][80,255,255] 表示绿色。你能解释一下吗?
  • 可以看到这篇文章medium.com/dataseries/…的HSV图。这将使您了解 HSV 颜色空间中的值如何变化。
  • 如果你想找出你的图像,我建议你保持第二个和第三个值,即 50 和 255 相同。要找到第一个值,您可以将 BGR 值转换为图像中最深和最浅蓝色的 HSV,以找出色调的值。
猜你喜欢
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多