参考文献:基于OpenCV的彩色空间互转 和 图像处理之灰色图转化为RGB图像.
对于一张图片,进行色彩空间转换,只是把它每个像素点的表示形式改变了,不管用RGB的表示形式,还是HSV的表示形式,把像素值按相应色彩空间的规则转换成对应的颜色后,表示的还是这张图片。
**注意:**这里的灰度图在向RGB图像转换时,RGB值均一样,也就是说虽然转换后的图像的通道从灰度图的一层转换为三层,但是从视觉感受上,转换后的图像仍旧为灰色图像。
import cv2
import numpy as np
if __name__ == "__main__":
img = cv2.imread('D:/yt/pictures2/dog.jpg', cv2.IMREAD_UNCHANGED)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
bgr = cv2.cvtColor(gray,cv2.COLOR_GRAY2BGR)
# 显示图像
cv2.imshow("origin image", img)
cv2.imshow("gray image", gray)
cv2.imshow("bgr image", bgr)
# 保存图像
cv2.imwrite("D:/yt/pictures2/bgr-gray-dog.jpg", gray)
cv2.imwrite("D:/yt/pictures2/gray-bgr-dog.jpg", bgr)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果
此时会发现一个问题:为什么由RGB转换为灰度图,再转换回RGB时,图像是灰色而不是彩色了?
另外一个问题是如何使得灰度图能够恢复到原来的彩色图像呢?
答案是:逆向处理我们要将RGB表示转换为gGB表示,也就是用灰度分量g取代蓝色分量R,蓝色分量B和绿色分量G不变。我们可以从gGB计算出红色分量R,因为灰度g=pR+qG+tB(其中p=0.2989,q=0.5870,t=0.1140),于是R=(g-qG-t*B)/p。于是我们只要保留B和G两个颜色分量,再加上灰度图g,就可以回复原来的RGB图像。
代码如下:
from __future__ import division
import numpy as np
import cv2
src = cv2.imread("C:/Users/12914/Pictures/messi.jpg")
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
# RGB在opencv中存储为BGR的顺序,数据结构为一个3D的numpy.array,索引的顺序是行,列,通道:
B = src[:,:,0]
G = src[:,:,1]
R = src[:,:,2]
# 灰度g=p*R+q*G+t*B(其中p=0.2989,q=0.5870,t=0.1140),于是B=(g-p*R-q*G)/t。于是我们只要保留R和G两个颜色分量,再加上灰度图g,就可以回复原来的RGB图像。
g = src_gray[:]
p = 0.2989; q = 0.5870; t = 0.1140
B_new = (g-p*R-q*G)/t
B_new = np.uint8(B_new)
src_new = np.zeros((src.shape)).astype("uint8")
src_new[:,:,0] = B_new
src_new[:,:,1] = G
src_new[:,:,2] = R
# 显示图像
cv2.imshow("input", src)
cv2.imshow("output", src_gray)
cv2.imshow("result", src_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果
认真思考过的学友可能会有看出一件事情:这个回复的过程,不仅仅需要灰度图像的数据,而且还需要原来彩色图像的数据。那么如果我知道了原来彩色图像的数据,那我为什么还要通过转换这种方式得到一张本身就存在的彩色图像呢?所以这样的答案并不适合应用情况,只是用作理解互转过程,换句话说,灰度图可以转换为RGB图像,但是无法恢复到本来的彩色图像。
import cv2
import numpy as np
if __name__ == "__main__":
img = cv2.imread('D:/yt/pictures2/dog.jpg', cv2.IMREAD_UNCHANGED)
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
bgr = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
# 显示图像
cv2.imshow("origin image", img)
cv2.imshow("hsv image", hsv)
cv2.imshow("bgr image", bgr)
# 保存图像
cv2.imwrite("D:/yt/pictures2/bgr-hsv-dog.jpg", hsv)
cv2.imwrite("D:/yt/pictures2/hsv-bgr-dog.jpg", bgr)
cv2.waitKey(0)
cv2.destroyAllWindows()