基于人工智能平台的opencv图片操作之图片色域检测

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函数可以绘制矩形轮廓。

基本思路:

  1. 采集物体色彩空间范围Y,并定义掩膜的空间范围(就是通过掩模找到目标颜色)
  2. 导入图像
  3. OpenCV检测图像中色彩在范围Y内的区域,并生成二值化图像
  4. 对二值化图做降噪处理,滤除图片中的小范围区域,得到新图像
  5. 计算保留在图像中范围最大的区域
  6. 计算该区域的质心,该质心即是物体的位置

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()

运行代码可以到如下效果

运行结果图

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值