OpenCV或SimpleCV中的颜色转换
我看过文档,但没找到有没有什么方法可以用公式来改变整个图像的颜色。这是不是和颜色曲线函数有关呢?我对这些函数的效果不是很清楚——我试过它们,但不太明白每个参数的作用。
举个例子:如果我想用下面的公式来改变一张图片的颜色
(2R - 0.5G - B)/4
我看了一些函数,有些看起来可能适用,但我不太明白参数的意思。有没有简单的方法可以在SimpleCV和/或OpenCV中做到这一点?
补充:
我所说的“改变”,是指拿到图像的RGB值,然后把这个公式应用到这些值上,这样就得到了新的RGB值。或者,除了公式,还可以用一个矩阵,比如:
[Y] [0.299 0.587 0.114 ][R]
[I] = [0.596 -0.274 -0.322 ][G]
[Q] [0.212 -0.523 0.311 ][B]
2 个回答
0
dest(I) = mtx * src(I)
这要看你使用的接口是什么。
如果你用的是Python,那就简单多了,因为图像在这里是用numpy数组来表示的。
所以,如果你想得到一个图像,计算方式是(2R - 0.5G - B)/4,你可以这样做:
imgF = img.astype('float') # convert from INT to FLOAT
# note that OpenCV loads it as Blue,Green,Red. not RGB.
imgTransformed = (2.*imgF[:,:,2] - .5*imgF[:,:,1] - imgF[:,:,0])/4
关于矩阵变换,可以看看OpenCV的transform
函数。根据文档,它会对每个索引I
进行操作。
所以针对你问题中的矩阵例子,你可以这样做:
cv2.transform( img, [ [ 0.114, 0.587, 0.299],
[-0.322, 0.274, 0.596],
[ 0.311,-0.523, 0.212] ] )
注意:我把你的第1列和第3列调换了,因为在OpenCV中,图像的通道顺序是B,G,R,而不是R,G,B。
2
在SimpleCV中,你只需要这样做:
from SimpleCV import *
img = Image('simplecv')
(r,g,b) = img.splitChannels(False) #we pass false to break into color channels, not greyscale
updated = ((r * 2) - (g * 0.5) - b)/4
updated.show()