“Python-OpenCV初体验:简单实现颜色辨认与轮廓绘制”

打印 上一主题 下一主题

主题 802|帖子 802|积分 2406

一、引言
图像处理技术在当代科技中扮演着紧张脚色,但对于初学者来说,掌握这些技术大概显得有些复杂。在这篇博客中,我们将带你一步步相识如何利用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 代码实现
辨认图片中的黄色

  1. import cv2
  2. import numpy as np
  3. # 1、输入图片
  4. img = cv2.imread("./color1.png")
  5. img = cv2.resize(img, (0,0), fx=0.5,fy=0.5)
  6. # 2、需要识别颜色 转换HSV颜色空间
  7. img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
  8. hsv_min = np.array([26,43,46])
  9. hsv_max = np.array([34,255,255])
  10. img_hsv_mask = cv2.inRange(img_hsv,hsv_min,hsv_max)
  11. # 3、设定要识别HSV颜色范围,并利用inrange找到该颜色范围
  12. img_hsv_mask_color = cv2.bitwise_and(img,img,mask=img_hsv_mask)
  13. # 4、进行滤波
  14. img_gaussian_blur = cv2.GaussianBlur(img_hsv_mask, (3,3),10)
  15. # 5、形态学变换——开运算 先腐蚀再膨胀
  16. kernal = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
  17. img_erode = cv2.erode(img_gaussian_blur,kernal)
  18. img_erode_dilate = cv2.dilate(img_erode,kernal)
  19. # 6、寻找轮廓
  20. contours, hierarchy = cv2.findContours(img_erode_dilate,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
  21. # 7、for循环遍历所有轮廓--通过面积筛选你想要的轮廓 cv2.contourArea()--绘制轮廓
  22. img_copy = img.copy()
  23. for i in contours:
  24.     if cv2.contourArea(i)<200 or cv2.contourArea(i)>200000:
  25.         continue
  26.     cv2.drawContours(img_copy,contours,-1,(0,0,255),2)
  27. # 8、输出图片
  28. cv2.imshow('image', img)
  29. cv2.imshow('img_copy', img_copy)
  30. cv2.waitKey(0)
复制代码
 结果:

五、结语
在本文中,我们探索了如何通过颜色辨认和轮廓绘制来处理图像。通过将图像转换为HSV颜色空间,并设定特定的颜色范围,我们成功地提取了目标颜色区域。别的,我们使用形态学变动和滤波技术,进一步优化了图像处理结果,最终通过轮廓检测技术正确地绘制了目标区域的轮廓。
感谢阅读,并期待你的反馈与交流!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

耶耶耶耶耶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表