在opencv中有超过150种进行颜色转换的方法,但我们经常用到的只是两种:BGR-灰度图,跟BGR-HSV。
我们用到的函数是:cv2.cetColor(input_image,flag),flag就是我们要转换的类型。
对于灰度图转换,flag就是cv2.COLOR_BGR2GRAY,对于HSV转换,用到的flag是cv2.COLOR_BGR2HSV。
详细可看 点击打开链接
在opencv的HSV格式中,H(hue:色彩/亮度)的取值范围是[0,179],S(saturation:饱和度)取值范围是[0,255],V(value:亮度)的取值范围是[0,255]。
1、提取图像中的蓝色部分
代码:
import cv2
import numpy as np
img=cv2.imread('C:\\Users\\WLX\\Desktop\\10.jpg',cv2.IMREAD_COLOR)
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
lower_blue=np.array([110,50,50])
upper_blue=np.array([130,255,255])
mask=cv2.inRange(hsv,lower_blue,upper_blue)
res=cv2.bitwise_and(img,img,mask=mask)
cv2.imshow('hsv',hsv)
cv2.imshow('mask',mask)
cv2.imshow('res',res)
cv2.imshow('img',img)
k=res=cv2.waitKey(5)&0xFF
while k==27:
break
cv2.waitKey(0)
cv2.inRange()函数
第一个参数是原数组,可以是单通道也可以是多通道,lower:下界 upper上界
在python中,假设是单通道,如果lower=[0],upper=[128],对每个数在0-128之间取255,其余的取0
如果在多通道,假设lower=[0,0,0],upper=[128,128,128],对于每个数都在0-128之间取255,其余的取0,最后几个数相与,都是255取255,否则取0
结果:
mask:
res:
2、如何寻找对象的HSV值
上面我们提取蓝色,但我们首先应该知道蓝色的HSV值,我们用一下函数取找出
函数:
import numpy as np
import cv2
green=np.uint8([[[0,255,0]]])
hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print(hsv_green)
结果是:[[[60 255 255]]]
那我们可以使用[H-10,100,100]作为下限,[H+10,255,255]作为上限。
3、练习
同时提取三个不同颜色的物体
原图:
代码:
import numpy as np
import cv2
img=cv2.imread('C:\\Users\\WLX\\Desktop\\12.png',cv2.IMREAD_COLOR)
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
lower_blue=np.array([110,100,100])#blue
upper_blue=np.array([130,255,255])
lower_green=np.array([50,100,100])#green
upper_green=np.array([70,255,255])
lower_red=np.array([0,100,100])#red
upper_red=np.array([10,255,255])
blue_mask=cv2.inRange(hsv,lower_blue,upper_blue)
green_mask=cv2.inRange(hsv,lower_green,upper_green)
red_mask=cv2.inRange(hsv,lower_red,upper_red)
blue=cv2.bitwise_and(img,img,mask=blue_mask)
green=cv2.bitwise_and(img,img,mask=green_mask)
red=cv2.bitwise_and(img,img,mask=red_mask)
res=red+blue+green
cv2.imshow('res',res)
cv2.imwrite('C:\\Users\\WLX\\Desktop\\444.jpg',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果: