Task03-CV彩色空间互转
1、现在初期的目标就是做一个简单的掉包侠;我也虽然知道原理,但是总感觉:用代码表达出来很困难;
2、图像彩色空间互转在图像处理中应用非常广泛,而且很多算法只对灰度图有效;另外,相比RGB,其他颜色空间(比如HSV、HSI)更具可分离性和可操作性,所以很多图像算法需要将图像从RGB转为其他颜色空间,所以图像彩色互转是十分重要和关键的。
1 学习内容
1、掌握相关颜色空间的原理和颜色空间相互转理论
2、掌握OpenCV框架下颜色空间互转API的使用
3、提高进阶版:根据原理动手实践出来
2 算法理论介绍与资料推荐
2.1 RGB与灰度图互转
RGB(红绿蓝)是依据人眼识别的颜色定义出的空间,是在绘画色彩中调制出来各种颜色;
但在科学研究一般不采用RGB颜色空间,因为它的细节难以进行数字化的调整。它将色调,亮度,饱和度三个量放在一起表示,很难分开;—有个立体图来表示
它是最通用的面向硬件的彩色模型。该模型用于彩色监视器和一大类彩色视频摄像;
原理:RGB颜色空间 基于颜色的加法混色原理,从黑色不断叠加Red,Green,Blue的颜色,最终可以得到白色
我们常常需要将彩色图像转换成灰度图像,也就是3个通道(RGB)转换成1个通道。
2.1.1 平均法
最简单的方法当然就是平均法,将同一个像素位置3个通道RGB的值进行平均。
I(x,y) = 1/3 * I_R(x,y) +1/3 * I_G(x,y)+ 1/3 * I_B(x,y)
# %% 使用平均值法
# I(x,y) = 1/3 * I_R(x,y) +1/3 * I_G(x,y)+ 1/3 * I_B(x,y)
import cv2
import numpy as np
img=cv2.imread('lena.jpg')
rows,cols,channel = img.shape
lena_average_gray = np.zeros((rows,cols))
for r in range(rows):
for l in range(cols):
lena_average_gray[r, l] = 1 / 3 * img[r, l, 0] + 1 / 3 *img[r, l, 1] + 1 / 3 * img[r, l, 2]
cv2.imshow('img',img)
cv2.imshow('lena_gray',lena_average_gray.astype("uint8"))
cv2.waitKey()
2.1.2 最大最小值平均法
# %% 最大最小平均法
# 取同一个像素位置的RGB中亮度最大的和最小的进行平均
# I(x,y) = 0.5 * max(I_R(x,y), I_G(x,y), I_B(x,y))+ 0.5 * min(I_R(x,y), I_G(x,y), I_B(x,y))
import cv2
import numpy as np
img=cv2.imread('lena.jpg')
rows,cols,channel = img.shape
lena_maxmin_gray=np.zeros((rows,cols))
for r in range(rows):
for l in range(cols):
lena_maxmin_gray[r,l] = 1/2(max(img[r,l,0],img[r,l,1],img[r,l,2])+min(img[r,l,0],img[r,l,1],img[r,l,2]))
cv2.imshow('lena_maxmin',lena_maxmin_gray.astype("uint8"))
cv2.waitKey()
2.1.3 加权平均法
# %% 加权平均法
# 最流行的 I(x,y) = 0.3 * I_R(x,y) +0.59 * I_G(x,y)+ 0.11 * I_B(x,y)
import cv2
import numpy as np
img=cv2.imread('lena.jpg')
rows,cols,channel = img.shape
lena_weight_gray =np.zeros((rows,cols))
for r in range(rows):
for l in range(cols):
lena_weight_gray[r,l] = 0.3*img[r,l,0]+0.59*img[r,l,1]+0.11*img[r,l,2]
cv2.imshow('lena_weight',lena_weight_gray.astype("uint8"))
cv2.waitKey()
2.2 RGB与HSV互转
HSV和HSI之间的不同就只是亮度的不同 一个是取最大值 I(R,G,B),一个是取平均值;
为什么需要HSV彩色图像格式呢? 相比原始的RGB图像,HSI图像对颜色信息的利用率更高,更适合于目标分析和目标分割等场景。
用一幅图来解释HSI的模型:
色调(Hue):是指一种纯色的颜色属性;黄色,橙色之类的
饱和度(Saturation):是指纯色被白光稀释的程度的度量,(饱和度越大越鲜艳);
亮 度(Intensity):是一个主观因子,实际上是不可度量的,(亮度和图像灰度是颜色的明亮程度)
H=色相;决定是什么颜色,S=饱和度(纯度);决定颜色浓淡,B=明度(亮度);决定照射在颜色上的白光有多亮
2.2.1 RGB2HSI
2.2.2 HSI2RGB
3 代码实践
3.1 调用OpenCV实现
# 不知道为什么就是最后实现不出来
import cv2
import numpy as np
lena_BGR=cv2.imread('lena.jpg')
lena_RGB=cv2.cvtColor(lena_BGR,cv2.COLOR_BGR2RGB)
lena_HSV=cv2.cvtColor(lena_BGR,cv2.COLOR_BGR2HSV)
cv2.imshow('lena_weight',lena_HSV.astype("uint8"))
cv2.waitKey()