一、引言
图像处理技术在当代科技中扮演着紧张脚色,但对于初学者来说,掌握这些技术大概显得有些复杂。在这篇博客中,我们将带你一步步相识如何利用Python和OpenCV来辨认图像中的颜色并绘制轮廓。通过简明的实行原理和代码示例,你将学会如何在实际项目中应用这些底子技术。
二、实行原理
找到轮廓:使用cv2.findContours()函数找到图像中的轮廓。轮廓是图像中具有雷同颜色或灰度值的所有一连点。
绘制轮廓:使用cv2.drawContours()函数在原始图像上绘制找到的轮廓。
三、实行代码
3.1 功能简介
contours,hierarchy = cv2.findContours(image,mode,method)
用于在二值图像中检测轮廓。轮廓可以看作是将雷同颜色或灰度级别的所有一连点(沿边界)连接起来的曲线。
3.2 参数详解
image:表示输入的二值化图像。
mode:表示轮廓的检索模式。有以下几种:
cv2.RETR_EXTERNAL: 只检索最外层的轮廓。
cv2.RETR_LIST: 检索所有的轮廓,但不建立层级关系。
cv2.RETR_CCOMP: 检索所有轮廓,并将它们组织成两层:顶层是外部边界,第二层是内部孔洞的边界。
cv2.RETR_TREE: 检索所有轮廓,并重构嵌套轮廓的完备层级。
method:轮廓的表示方法。有以下几种:
cv2.CHAIN_APPROX_NONE: 将所有的点连成线。
cv2.CHAIN_APPROX_SIMPLE: 压缩水平的、垂直的和对角线段,只保留其端点。
cv2.CHAIN_APPROX_TC89_L1 和 cv2.CHAIN_APPROX_TC89_KCOS: 其他更高级的近似方法。
3.3 返回值
contours: 一个包含轮廓的列表。每个轮廓都是一个由点(x, y)坐标构成的Numpy数组。
hierarchy: 可选输出,包含关于图像拓扑的信息。仅在使用层级检索模式时返回。
3.4 功能简介
cv2.findContours(image, mode, method, contour, hierarchy, offset.)
用于在图像上绘制轮廓。
3.5 参数详解
image: 要绘制轮廓的原始图像。
contours: 包含所有轮廓的列表,通常是通过 cv2.findContours() 获取的。
contourIdx: 指定绘制哪个轮廓。假如是 -1,则绘制所有轮廓。
color: 轮廓线条的颜色,使用BGR格式。
thickness: 轮廓线条的厚度。假如是 -1,则填充轮廓内部。
lineType: 线条的类型,可以是 8、4 或者 cv2.LINE_AA(抗锯齿)。
hierarchy: 可选参数,使用和 cv2.findContours() 雷同的层级信息。
maxLevel: 绘制轮廓的最大层级,假如是 -1,则绘制所有层级。
3.6 代码实现
辨认图片中的黄色
- import cv2
- import numpy as np
- # 1、输入图片
- img = cv2.imread("./color1.png")
- img = cv2.resize(img, (0,0), fx=0.5,fy=0.5)
- # 2、需要识别颜色 转换HSV颜色空间
- img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
- hsv_min = np.array([26,43,46])
- hsv_max = np.array([34,255,255])
- img_hsv_mask = cv2.inRange(img_hsv,hsv_min,hsv_max)
- # 3、设定要识别HSV颜色范围,并利用inrange找到该颜色范围
- img_hsv_mask_color = cv2.bitwise_and(img,img,mask=img_hsv_mask)
- # 4、进行滤波
- img_gaussian_blur = cv2.GaussianBlur(img_hsv_mask, (3,3),10)
- # 5、形态学变换——开运算 先腐蚀再膨胀
- kernal = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
- img_erode = cv2.erode(img_gaussian_blur,kernal)
- img_erode_dilate = cv2.dilate(img_erode,kernal)
- # 6、寻找轮廓
- contours, hierarchy = cv2.findContours(img_erode_dilate,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
- # 7、for循环遍历所有轮廓--通过面积筛选你想要的轮廓 cv2.contourArea()--绘制轮廓
- img_copy = img.copy()
- for i in contours:
- if cv2.contourArea(i)<200 or cv2.contourArea(i)>200000:
- continue
- cv2.drawContours(img_copy,contours,-1,(0,0,255),2)
- # 8、输出图片
- cv2.imshow('image', img)
- cv2.imshow('img_copy', img_copy)
- cv2.waitKey(0)
复制代码 结果:
五、结语
在本文中,我们探索了如何通过颜色辨认和轮廓绘制来处理图像。通过将图像转换为HSV颜色空间,并设定特定的颜色范围,我们成功地提取了目标颜色区域。别的,我们使用形态学变动和滤波技术,进一步优化了图像处理结果,最终通过轮廓检测技术正确地绘制了目标区域的轮廓。
感谢阅读,并期待你的反馈与交流!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |