为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

哆啦的时光机 2022-12-14 20:49:20
我试过这个脚本来替换图像的单一颜色。我需要重新着色图像中的相似颜色。例如,我有一个蓝色,石板蓝。我想用红色重新着色这两种颜色。但正如我在下面提到的,我不能那样做。它可以在 PIL 或 Python 中的 OpenCV 库中。import numpy as npfrom PIL import Imageimage = Image.open('wall.jpg')data = np.array(im)r1, g1, b1 = 81, 90, 103 # Original valuer2, g2, b2 = 255, 0, 0 # Value that we want to replace it withred, 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()
查看完整描述

1 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

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

结果


我转换了绿色,因为这张图片中的蓝色非常少。您可以将[100, 50, 50]其用作较低范围和[130, 255, 255]较高范围。


查看完整回答
反对 回复 2022-12-14
  • 1 回答
  • 0 关注
  • 64 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信