1. 实验目的
了解HSV色域和提取特定颜色的目标.
2.实验设备
安装了python和pychrm的电脑一台。
3.实验内容
包含图片的导入、色域检测、绘制矩形、显 示图片。
4.实验原理
色域检测重要的一步是把图像转为HSV图像,由于HSV的颜色空间比BGR空间更容易表示特定的颜色,故我们将BGR空间转换成HSV,一般以HSV为颜色检测和识别:H--色调(红-绿-蓝);S--饱和度(颜色深浅);V-亮度(颜色亮暗)。
要想实现颜色的识别,我们要打开摄像头,或读取一张图像。将图像的BGR颜色通道转化为HSV,然后设置HSV的阀值指定颜色范围(我们要检测的颜色范围)。我们使用inRange()函数实现二值化功能(这点类似threshold()函数),更关键的是可以同时针对多通道进行操作,使用起来非常方便!主要是将在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0),该功能类似于之间所讲的双阈值化操作,能得到掩模(mask)图像。
首先我们要获取某个颜色就要设定一个范围的阈值,二值化处理能够将我们需要的颜色置0,其他颜色置为255,才能筛选出目标颜色的掩模图像。选择正确的阈值是阈值分割的关键。
灰度阈值化是最简单的分割处理。很多物体或图像区域表征为不变的反射率或其表面光的吸收率,可以确定一个亮度常亮即阈值来分割背景和物体。阈值化计算代价小速度快,它是最老的分割方法。
在inRange二值化处理后我们要进行腐蚀膨胀操作消除其他干扰,erode函数实现腐蚀操作,dilate函数实现膨胀操作,先腐蚀后膨胀可以去掉小的对象,假设对象是前景色,背景是黑色,这样我们就得到了一张掩模图像,就可以与源图像进行与操作,把不是我们需要的颜色置成黑色,否则不变。
bitwise_and函数实现对目标提取,这是一个‘与’操作,用二值化后的掩模图像进行与操作,找出阈值范围内的颜色区域,找到了颜色区域我们就要找出轮廓将其画制出来
findContours函数找到轮廓。Rectangle函数可以绘制矩形轮廓。
基本思路:
- 采集物体色彩空间范围Y,并定义掩膜的空间范围(就是通过掩模找到目标颜色)
- 导入图像
- OpenCV检测图像中色彩在范围Y内的区域,并生成二值化图像
- 对二值化图做降噪处理,滤除图片中的小范围区域,得到新图像
- 计算保留在图像中范围最大的区域
- 计算该区域的质心,该质心即是物体的位置
opencvHSV颜色范围:
H(0-180) S(0-255) V(0-255)

HSV颜色范围
5.实验步骤
打开pycharm。
我们右击相应的文件目录,选择new--->点击Python File,然后输入新建的文件名,点击确定,相应的.py文件就建好了,可以进行编写代码了。
ipoert cv2
读取图片并转换为灰度图像。
frame = cv2.imread('..\images\mak.png')#读取图片
改变图像大小。
frame = imutils.resize(frame,width=400)
将图像转换为HSV。
hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)#转变成hsv
设定阈值。
lower_hsv = np.array([26,43,45])
upper_hsv = np.array([34,255,255])#范围(黄色)
inrange()函数二值化生成mask掩模图像。
mask = cv2.inRange(hsv,lower_hsv,upper_hsv)
腐蚀膨胀操作消除噪声。
##腐蚀操作
erosion = cv2.erode(mask, kernel, iterations=1)
##膨胀操作
dilate = cv2.dilate(erosion, kernel, iterations=1)
与操作:bitwise_and是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0。
##与操作
dst = cv2.bitwise_and(frame,frame,mask=dilate)#提取特定颜色
findContours函数找到目标的轮廓。
contours, hier = cv2.findContours(mask, cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
找出最小矩形并绘制矩形,(x,y)是矩阵的左上点坐标;(x+w,y+h)是矩阵的右下点坐标;(0,255,0)是画线对应的rgb颜色;2是所画的线的宽度。
cv2.imshow('vide',frame)
for c in contours:
x, y, w, h = cv2.boundingRect(c)
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
显示绘制轮廓的图像。
cv2.imshow('video',frame)
cv2.imshow('mask',mask)
cv2.imshow('dst',dst)
c = cv2.waitKey()
运行代码可以得到如下效果。

运行结果图
7428

被折叠的 条评论
为什么被折叠?



