使用OpenCV提取不同颜色物体

在我们的程序中,我们要提取的是一个蓝色的物体。下面就是就是我们要做的几步:

• 将图像转换到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的投射。

 

posted @ 2018-06-26 12:05  Neal_Pu  阅读(6317)  评论(0编辑  收藏  举报