在图像处理的应用中各种色彩空间的转换非常重要,尤其是RGB与HSV(HIS)空间相互转换,H(色调)S(饱和度)V(亮度)。
图像色彩空间转换
RGB:
• RGB颜色模型称为与设备相关的颜色模型,RGB颜色模型所覆盖的颜色域取决于显示设备荧光点的颜色特性,与硬件相关。
• 使用最多,最熟悉的颜色模型。它采用三维直角坐标系。红、绿、蓝原色是加性原色,各个原色混合在一起可以产生复合色。
• RGB颜色模型通常采用单位立方体来表示。在正方体的主对角线上,各原色的强度相等,产生由暗到明的白色,也就是不同的灰度值。(0,0,0)为黑色,(1,1,1)为白色。正方体的其他六个角点分别为红、黄、绿、青、蓝和品红。
HSI:
HSI模型的建立基于两个重要的事实:
① I分量与图像的彩色信息无关;② H和S分量与人感受颜色的方式是紧密相联的。
• HSI颜色模型的双圆锥表示
– I是强度轴
– 色调H的角度范围为[0,2π],其中,纯红色的角度为0,纯绿色的角度为2π/3,纯蓝色的角度为4π/3。
– 饱和度S是颜色空间任一点距I轴的距离。
• 注意: 当强度I=0时,色调H、饱和度S无定义;当S=0时,色调H无定义。
#4.1,色彩空间转换
import cv2 as cv
import numpy as np
def colorSpace_Transform(image):
grayImage=cv.cvtColor(image,cv.COLOR_BGR2GRAY)#转换为灰度图像
hsvImage=cv.cvtColor(image,cv.COLOR_RGB2HSV)#转换为HSV图像
yuvImage=cv.cvtColor(image,cv.COLOR_RGB2YUV)#转换为YUV图像
labImage=cv.cvtColor(image,cv.COLOR_BGR2Lab)#转换为LAB图像
xyzImage=cv.cvtColor(image,cv.COLOR_BGR2XYZ)#转换为XYZ图像
cv.namedWindow("Saber",0)
cv.imshow("Saber",image)
cv.namedWindow("grayImage",0)
cv.imshow("grayImage",grayImage)
cv.namedWindow("hsvImage",0)
cv.imshow("hsvImage",hsvImage)
cv.namedWindow("yuvImage",0)
cv.imshow("yuvImage",yuvImage)
cv.namedWindow("labImage",0)
cv.imshow("labImage",labImage)
cv.namedWindow("xyzImage",0)
cv.imshow("xyzImage",xyzImage)
srcImage2=cv.imread('F:\OutputResult\SrcImage\saber9.jpg')
colorSpace_Transform(srcImage2)
cv.waitKey(0)
cv.destroyAllWindows()
程序运行效果:
- 函数参数说明:
- cv.cvtColor(image,cv.COLOR_BGR2GRAY)
- 第一个参数:表示输入图像,即待转换的图像。
- 第二个参数:表示需要转换的色彩空间。
色彩过滤:
彩色空间的相互转换在图像处理领域的一个简单的重要应用就是特定图像色彩的过滤,一般在RGB空间下要过滤掉色彩不是那么容易,在HSV空间中就可以很容易地做到。
视频色彩过滤:
一般对颜色空间的图像进行有效处理都是在HSV空间进行的,然后对于基本色中对应的HSV分量需要给定一个严格的范围,首先要了解想要滤掉的色彩在HSV空间中范围,没有特定的准确范围,下面是通过实验计算的模糊范围:
对于HSV空间中Opencv计算时各自的最大和最小取值范围为:
H:[0,180];S:[0,255];V[0,255]。
此处把部分红色归为紫色范围:
过滤视频中的指定范围像素值:
#4.2,色彩过滤
import cv2 as cv
import numpy as np
def color_Filter():
capture=cv.VideoCapture(r'F:\OutputResult\1.avi')#实例化并读取视频
while True:
ret,frame=capture.read()
if ret==0:
print("视频未找到!!!")
else:
hsvImage=cv.cvtColor(frame,cv.COLOR_BGR2HSV)#转换为hsv色彩空间
#设置视频中需要过滤颜色最大值和最小值PS:由于图像为三通道,所以下面阈值为三个通道分别各自的阈值
lower_hsv=np.array([0,40,46])
high_hsv=np.array([10,255,255])
mask=cv.inRange(hsvImage,lower_hsv,high_hsv)
cv.imshow("video",hsvImage)
cv.imshow("mask",mask)
#表示等待显示时间间隔为30ms,按下"q"按键退出
if cv.waitKey(30)& 0xFF==ord('q'):
break
color_Filter()
cv.waitKey(0)
cv.destroyAllWindows()
函数参数说明:
cv.inRange(src, lowerb, upperb[, dst]) :
对于单通道图像,将像素值在[lowerb,upperb]的阈值范围内,则在dst图像中令该像素值为255,否则令其为0,这样就生成了一幅二值化的输出图像。
对于三通道图像,要满足三个通道以及多通道图像都满足在[lowerb,upperb]的阈值范围内,则进行二值化输出。
src:输入图像(CV_8U即,无符号8位整型)
lowerb:低阈值
upperb:高阈值
[,dst]:表示可选择的参数,输出图像
效果如下:
参考文献: