9

我正在用用户选择的颜色替换图像中的某些颜色。我正在使用 OpenCV 进行颜色替换。

简而言之,我已经描述了我从哪里获得帮助以及我得到了什么。

  1. 如何更改图像中的特定颜色? 我已经按照上述链接的答案执行了该步骤或采取了基本思路。在该链接的正确答案中,那个人告诉您只需要更改色调即可进行颜色替换。

  2. 之后,我遇到了类似于 iPhone 应用程序图像中的颜色替换的问题(即,对于完全是初学者的人来说,这是很好的颜色替换代码)
    ,我认为我也需要更改“饱和度”。


现在我遇到了类似的问题

“当我的源图像太亮(即亮度高)并且我用一些深色替换颜色时,替换图像中的颜色看起来很亮而不是暗,因为看起来替换的颜色与我们使用的颜色不匹配替代品”

发生这种情况是因为我没有考虑更换时的亮度。在这里我被卡住了改变亮度的公式或想法是什么?

假设我用目标颜色的亮度替换图像的亮度,那么它看起来像平面替换,图像将失去它的实际阴影或边缘。

编辑:
当我考虑替换源(即要处理的像素)的亮度时,我面临一个问题。让我根据我的应用程序的场景进行解释。

例如,我正在更改汽车的颜色(如 whiteAngl 解释),之后我将擦除新颜色汽车的一小部分。我再次对擦除部分进行重新着色,但现在发生的是擦除后完成的颜色和擦除前的颜色不匹配,因为这两次我都得到不同的亮度,因为我要处理的像素都发生了变化,并且由于亮度输出颜色改变。如何克服这个问题

任何帮助将不胜感激

彩色图像 删除了几个部分 重新着色

4

2 回答 2

12

没有看到你尝试过的代码,很难猜出你做错了什么。为了用一个具体的例子向你展示这是如何做到的,让我们改变这辆车难看的蓝色:

在此处输入图像描述

这个简短的 Python 脚本展示了我们如何使用 HSV 颜色空间更改颜色:

import cv2
orig = cv2.imread("original.jpg")
hsv = cv2.cvtColor(orig, cv2.COLOR_BGR2HSV)
hsv[:,:,0] += 100
bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
cv2.imwrite('changed.jpg', bgr)

你得到: 在此处输入图像描述

wikipedia上,您会看到色调介于 0 到 360 度之间,但对于 OpenCV 中的值,请参阅文档。您会看到我为图像中每个像素的色调添加了 100。我猜您想更改图像一部分的颜色,但您可能从上面的脚本中得到了这个想法。

以下是如何获得所要求的深红色汽车。首先我们得到红色的: 红牌

我试图保持金属感的深红色: 深红色的车

正如我所说,您用来改变颜色光线的方程式取决于您想要为对象使用的材料。在这里,我想出了一个快速而肮脏的方程式来保留汽车的金属材料。此脚本从第一个浅蓝色汽车图像生成上述深红色汽车图像:

import cv2
orig = cv2.imread("original.jpg")
hls = cv2.cvtColor(orig, cv2.COLOR_BGR2HLS)
hls[:,:,0] += 80 # change color from blue to red, hue
for i in range(1,50): # 50 times reduce lightness 
 # select indices where lightness is greater than 0 (black) and less than very bright 
 # 220-i*2 is there to reduce lightness of bright pixel fewer number of times (than 50 times), 
 # so in the first iteration we don't reduce lightness of pixels which have lightness >= 200, in the second iteration we don't touch pixels with lightness >= 198 and so on
 ind = (hls[:,:,1] > 0) & (hls[:,:,1] < (220-i*2))
 # from the lightness of the selected pixels we subtract 1, using trick true=1 false=0
 # so the selected pixels get darker
 hls[:,:,1] -= ind
bgr = cv2.cvtColor(hls, cv2.COLOR_HLS2BGR)
cv2.imwrite('changed.jpg', bgr)
于 2013-04-05T00:11:27.180 回答
1

你是对的:只改变色调根本不会改变亮度(或者由于一些感知效果非常弱),你想要的也是改变亮度。正如您所提到的,将亮度设置为目标亮度会丢失所有像素值(您只会看到饱和度的变化)。下一个是什么 ?

您可以做的是更改像素的色调尝试匹配平均亮度。为此,只需计算B要处理的所有像素的平均亮度,然后将所有亮度值乘以目标颜色Bt/BBt亮度。

这样做将匹配色调(由于第一步)和由于第二步而导致的亮度,同时保留边缘(因为您只修改了平均亮度)。

这是直方图匹配的一种特殊情况,在这里,您的目标直方图只有一个值(目标颜色),因此只有平均值才能以合理的方式匹配。

如果您正在寻找您的赏金请求中所述的“可靠来源”,我是哈佛的博士后,今年将在 Siggraph 上发表一篇关于颜色直方图匹配的论文;)。

于 2013-04-06T03:55:58.783 回答