【例 4.5】将图像从 BGR 模式转换为 RGB 模式。
import cv2
import numpy as np
lena = cv2.imread("/Users/zhaofeier/Desktop/lenacolor.png")
rgb = cv2.cvtColor(lena,cv2.COLOR_BGR2RGB)
cv2.imshow("lena",lena)
cv2.imshow("rgb",rgb)
cv2.waitKey()
cv2.destroyAllWindows()
1.获取制定颜色
【例 4.6】在 OpenCV 中,测试 RGB 色彩空间中不同颜色的值转换到 HSV 色彩空间后的对 应值。
首先,使用 np.zeros([1,1,3],dtype=np.uint8)来生成一幅仅有一个像素点的图像(数组)。 接下来,通过对其中的通道分量赋值,将其设定为指定的颜色。例如:
- 语句 imgBlue[0,0,0]=255 可以将该像素点的第 0 个通道(即 B 通道)的值设置为 255, 即将该点的颜色指定为蓝色。
- 语句 imgGreen[0,0,1]=255 可以将该像素点的第 1 个通道(即 G 通道)的值设置为 255, 即将该点的颜色指定为绿色。
- 语句 imgRed[0,0,2]=255 可以将该像素点的第 2 个通道(即 R 通道)的值设置为 255, 即将该点的颜色指定为红色。
然后,可以通过语句cv2.cvtColor(Blue,cv2.COLOR_BGR2HSV)
将 Blue 从 BGR 色彩空间 转换到 HSV 色彩空间。
最后,通过打印 HSV 色彩空间内的像素值,观察转换情况。
在本例中,对蓝色、绿色、红色三种不同的颜色分别进行转换,将它们从 BGR 色彩空间 转换到 HSV 色彩空间,并观察转换后所得到的 HSV 空间的对应值。
imgBlue = np.zeros([1,1,3],dtype=np.uint8)
imgBlue[0,0,0] = 255
Blue = imgBlue
BlueHSV = cv2.cvtColor(Blue,cv2.COLOR_BGR2HSV)
print("Blue=\n",Blue)
print("BlueHSV=\n",BlueHSV)
2. 标记制定颜色
在 HSV 色彩空间中,H 通道(饱和度 Hue 通道)对应不同的颜色。或者换个角度理解, 颜色的差异主要体现在 H 通道值的不同上。所以,通过对 H 通道值进行筛选,便能够筛选出 特定的颜色。例如,在一幅 HSV 图像中,如果通过控制仅仅将 H 通道内值为 240(在 OpenCV内被调整为 120)的像素显示出来,那么图像中就会仅仅显示蓝色部分。
2.1 通过inRange函数锁定特定值
OpenCV 中通过函数 cv2.inRange()
来判断图像内像素点的像素值是否在指定的范围内,其 语法格式为:
dst = cv2.inRange( src, lowerb, upperb )
式中:
- dst 表示输出结果,大小和 src 一致。 src 表示要检查的数组或图像。
- lowerb 表示范围下界。
- upperb 表示范围上界。
返回值 dst 与 src 等大小,其值取决于 src 中对应位置上的值是否处于区间[lowerb,upperb] 内: - 如果 src 值处于该指定区间内,则 dst 中对应位置上的值为 255。
- 如果 src 值不处于该指定区间内,则 dst 中对应位置上的值为 0。
【例 4.7】使用函数 cv2.inRange()将某个图像内的在[100,200]内的值标注出来。
img = np.random.randint(0,256,size=[5,5],dtype=np.uint8)
min = 100
max = 200
mask = cv2.inRange(img,min,max)
print(“img=\n”,img)
print(“mask=\n”,mask)
2.2 通过基于掩码的按位与显示ROI
【例 4.8】正常显示某个图像内的感兴趣区域(ROI),而将其余区域显示为黑色
img=np.ones([5,5],dtype=np.uint8)*9
mask =np.zeros([5,5],dtype=np.uint8)
mask[0:3,0]=1
mask[2:5,2:4]=1
roi=cv2.bitwise_and(img,img, mask= mask)
print("img=\n",img)
print("mask=\n",mask)
print("roi=\n",roi)
2.3 显示特定颜色值
【例 4.9】分别提取 OpenCV 的 logo 图像内的红色、绿色、蓝色。\
opencv = cv2.imread("/Users/zhaofeier/Desktop/源代码及图像/chapter4/opencv.jpg")
hsv = cv2.cvtColor(opencv,cv2.COLOR_BGR2HSV)
cv2.imshow("opencv",opencv)
#! 制定蓝色值的范围
minBlue = np.array([110,50,50])
maxBlue = np.array([130,255,255])
#hs 确定蓝色区域
mask = cv2.inRange(hsv,minBlue,maxBlue)
#hs 通过掩码控制的按位与运算,锁定蓝色区域
blue = cv2.bitwise_and(opencv,opencv,mask=mask)
cv2.imshow("blue",blue)
cv2.waitKey()
cv2.destroyAllWindows()
3. 标记肤色
在标记特定颜色的基础上,可以将标注范围进一步推广到特定的对象上。例如,通过分析 可以估算出肤色在 HSV 色彩空间内的范围值。在 HSV 空间内筛选出肤色范围内的值,即可将 图像内包含肤色的部分提取出来。
这里将肤色范围划定为:
- 色调值在[5, 170]之间
- 饱和度值在[25, 166]之间
【例 4.10】提取一幅图像内的肤色部分。
img = cv2.imread("/Users/zhaofeier/Desktop/源代码及图像/chapter4/lesson2.jpg")
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(hsv)
minHue = 5
maxHue = 170
hueMask = cv2.inRange(h,minHue,maxHue)
minSat = 25
maxSat = 166
satMask = cv2.inRange(s,minSat,maxSat)
mask = hueMask & satMask
roi = cv2.bitwise_and(img,img,mask=mask)
cv2.imshow("img",img)
cv2.imshow("roi",roi)
cv2.waitKey()
cv2.destroyAllWindows()
4. 实现艺术效果
【例 4.11】调整 HSV 色彩空间内 V 通道的值,观察其处理结果。
img = cv2.imread("/Users/zhaofeier/Desktop/源代码及图像/chapter4/barbara.bmp")
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(hsv)
v[:,:] = 255
newHSV = cv2.merge([h,s,v])
art = cv2.cvtColor(newHSV,cv2.COLOR_HSV2BGR)
cv2.imshow("img",img)
cv2.imshow("art",art)
cv2.waitKey()
cv2.destroyAllWindows()