1. 色彩空间转换
import cv2
import numpy as np
imgs = cv2.imread('water.jpg')
HSV_img = cv2.cvtColor(imgs,cv2.COLOR_BGR2HSV)
HSV2_img = cv2.cvtColor(HSV_img,cv2.COLOR_HSV2BGR)
cv2.imshow('BGR_student',imgs)
cv2.imshow('HSV_img',HSV_img)
cv2.imshow('HSV2_img',HSV2_img)
wait_re = cv2.waitKey(0) # 程序等待,否则会一闪而过
cv2.destroyAllWindows()
运行结果:
2. 标记指定颜色
在HSV色彩空间中,H通道对应不同的颜色,因此可以通过对H通道的筛选便能筛选出特定的颜色。
1)通过inRange函数锁定特定值
dst = cv2.inRange(src,lowerb,upperb)
src---表示要检查的数组或图像
lower---表示范围的下界
upper---表示范围的上界
dst---表示输出结果,大小和src一致。在设定范围(【lower,upper】)的,对应位置上的值为255,其余位置为0.
2)通过基于掩码的按位与显示ROI
3)显示特定颜色
提取颜色时,往往不是提取一个特定的值,而是提取一个颜色区间。例如,在OpenCV中的HSV色彩空间中,蓝色在H通道的值是120。在提取蓝色时,通常提取它附近的一个区间值,即[120-10,120+10]范围内的值来指定蓝色。相比之下,HSV模式中的S通道、V通道的值一般在区间【100,255】,因为当饱和度和亮度太低时,计算出来的色调可能就不可靠了。
另外绿色值分布在[50,100,100]和[70,255,255]之间;红色在[0,100,100]和[10,255,255]之间。
import cv2
import numpyas np
img = cv2.imread('water.jpg')
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
cv2.imshow('img_BGR',img)
cv2.imshow('img_hsv',hsv)
# 指定红的范围
minRed = np.array([10,100,100],dtype=np.uint8)
maxBRed = np.array([30,200,200],dtype=np.uint8)
mask_red = cv2.inRange(hsv,minRed,maxBRed)
red_part2 = cv2.bitwise_and(hsv,hsv,mask=mask_red)
cv2.imshow('red_part2',red_part2)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 标记肤色
通过分析估算出肤色在HSV空间内的范围,从而提取包含肤色部份图像。
这里将色调范围定在[5,170]
饱和度定在[25,166]
img = cv2.imread('houzi.jpeg')
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
cv2.imshow('img_BGR',img)
cv2.imshow('img_hsv',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_part1 = cv2.bitwise_and(img,img,mask=mask)
roi_part2 = cv2.bitwise_and(hsv,hsv,mask=mask)
cv2.imshow('roi_part1',roi_part1)
cv2.imshow('roi_part2',roi_part2)
cv2.waitKey(0)
4.实现艺术效果
在HSV模型内进行分量值的调整能生成一些有趣的效果。例如,将一幅图像的H通道和S通道保持不变,将其V通道的值都调整为255.
5.alpha通道
在RGB色彩空间加一个A通道,也叫alpha通道,用来表示透明度。这四个通道被称为RGBA色彩空间,png图像是一种典型的四通道图像,alpha通道的取值范围是[0,1],或者[0,255],表示从透明到不透明。
import cv2
import numpyas np
img = cv2.imread('wasser_2.jpg')
bgra = cv2.cvtColor(img,cv2.COLOR_BGR2BGRA)
b,g,r,a = cv2.split(bgra)
a[:,:] =80
bgra1 = cv2.merge([b,g,r,a])
cv2.imshow('img_BGR',img)
cv2.imshow('bgra1',bgra1)
a[:,:] =150
bgra2 = cv2.merge([b,g,r,a])
cv2.imshow('bgra2',bgra2)
a[:,:] =10
bgra3 = cv2.merge([b,g,r,a])
cv2.imshow('bgra3',bgra3)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('wasser_bgra3.png',bgra3)
cv2.imwrite('wasser_bgra3.jpg',bgra3)
显示出来是没有什么差别的,但保存的png图片是有差别的。