python-opencv之色彩空间,RGB2HSV色彩空间转换及应用
一、Python-opencv中的色彩空间
在这里主要介绍RGB和HSV色彩空间,这二者具体是什么这里不再详细介绍,其他回答都很详细。
这里要介绍一下二者的取值和关系:
在Python-opencv中,RGB图像三个通道的取值都是0~255,*
而HSV中H取值为0-180,S和V取值都是0-255,这是因为计算机用8位显示图像,取值范围为0-255,而HSV色彩空间H取值范围为0-360,S和V取值都是0-1,为了能够在计算机上显示必须映射到0-255,这里H就直接除以2得到的取值范围就是0-180了。具体的RGB到HSV的变换公式这里也不再详细介绍。
这里再附加一个HSV在原始HSV空间各个颜色的取值 和在Opencv中HSV各个颜色的取值
映射前
映射后
二、为什么同样的图片用公式换了色彩空间显示出来的完全不一样?
你是否有过这个问题?按理说我只是变换了色彩空间,图片还是那个图片,在不同的色彩空间展示的同一张图片应该看到的是一样的才对啊。原因是由于我们虽然得到了HSV的图片,也有H,S,V三个通道,但是我们的电脑显示的时候还是按照RGB的三个通道来显示的,所以我们看到的图片就不是原来的图片了。
三、cv2.inRange()函数
这个函数常常用来在HSV空间中挑选出想要的色彩部分,有三个参数.inRange(img,min,max)
具体怎么用这里就不在详细介绍了,本文只介绍这个函数的常用流程,通常分为四步:
min = np.array([Hl,Sl,Vl]) #设置范围下限
max = np.array([Hh,Sh,Vh])#设置范围上限
mask = cv.inRange(img,min,max)#制作mask
res = cv.bitwise_and(img,img,mask)#用带掩膜的与操作进行计算得到我们想要的结果
四、 BGRA图像
.png文件有alpha参数 用来透明化,但是只能保存了后打开才能看出差异,举例:
lena = cv.imread('lena.jpg',-1)
b,g,r,a, = cv.split(cv.cvtColor(lena,cv.COLOR_BGR2BGRA))#先转为RGBA然后分解,好修改alpha的值
a[:,:] = 255
lena255 = cv.merge([b,g,r,a])
a[:,:] = 125
lena125 = cv.merge([b,g,r,a])
cv.imwrite('lena255.png',lena255)
cv.imwrite('lena125.png',lena125)
对比:
a=255
a=125