在我们的程序中,我们要提取的是一个蓝色的物体。下面就是就是我们要做的几步:
• 将图像转换到HSV 空间
• 设置HSV 阈值到蓝色范围。
• 获取蓝色物体。
原图片如下:
我们需要从其中提取出蓝色的部分并显示出来。我们需要使用这样几个函数:
cv2.cvtColor():将载入的RGB模式图片转换为HSV模式,这是因为HSV模式下能够更加容易地表示一种特定地颜色。
cv2.inRange(src, lowerb, upperb, dst=None):将图片二值化。对于图片中的每一个像素点,将其值与lowerb和upperb进行比较,如果在这个范围内则将其设置为255,反之修改为0。使用这个函数我们可以得到ROI的掩模。
cv2.bitwise_and():按位与运算。我们使用图片ROI的掩模与原图进行按位与运算后,可将除ROI外的其他区域像素点的值变为0,而ROI区域的值则保持不变(按照二进制进行与运算时,有1&0=0,0&0=0,0&1=0,1&1=1;掩模上ROI区域像素点的值均被修改为255,即11111111,与原图片与运算后,原图片上对应ROI区域的像素点值保持不变;掩模上ROI区域以外的值被修改为0,与原图片进行与运算后,原图上对应区域的像素点值被修改为0)。
cv2.imshow():显示图片。
程序代码如下:
import cv2 import numpy as np lower_blue=np.array([110,50,50]) upper_blue=np.array([130,255,255]) img1=cv2.imread("Blue_Green_Red.jpg") xsize,ysize,channel=img1.shape #调整图片大小 img1=cv2.resize(img1,(ysize//2,xsize//2)) frame=cv2.cvtColor(img1,cv2.COLOR_BGR2HSV) mask_blue=cv2.inRange(frame,lower_blue,upper_blue) res_blue=cv2.bitwise_and(frame,frame,mask=mask_blue) res_blue=cv2.cvtColor(res_blue,cv2.COLOR_HSV2BGR) cv2.imshow("mask_blue",mask_blue) cv2.imshow("res_blue",res_blue) cv2.waitKey(0) cv2.destroyAllWindows()
运行结果如下:
可以看到,蓝色区域被很好的提取出来了。这种方法在选择非矩形ROI时非常有用,常常用于logo的投射。