当前位置: 首页 > news >正文

轮廓检测与处理

轮廓检测

先将图像转换成二值

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 灰度图
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)  # 变为二值,大于127置为255,小于100置为0.

使用cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)函数读取轮廓

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# contours:轮廓信息   hierarchy:层级
# cv2.RETR_TREE:检测所有轮廓,并重构嵌套轮廓的整个层次
# cv2.CHAIN_APPROX_NONE:freeman链码方式输出轮廓,所有其他方式输出多边形(顶点的序列)

绘图

-1表示画出全部轮廓,0,1,2依次为第1,2,3个轮廓
(0, 0, 255)bgr表示画红色
2表示线条宽度

draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)
# -1表示画出全部轮廓,(0, 0, 255)bgr表示画红色,2表示线条宽度

结果

show.cv_show('iron', img)
show.cv_show('thresh', thresh)
show.cv_show('res', res)

原图
原图
二值图
二值图
轮廓图
轮廓

轮廓特征

先提取另一幅图的轮廓

img2 = cv2.imread('duobianxing.png')
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)  # 灰度图
ret2, thresh2 = cv2.threshold(gray2, 127, 255, cv2.THRESH_BINARY)  # 变为二值,大于127置为255,小于100置为0.
contours2, hierarchy2 = cv2.findContours(thresh2, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
draw_img2 = img2.copy()
res2 = cv2.drawContours(draw_img2, contours2, -1, (0, 0, 255), 2)  # -1表示画出所有轮廓
show.cv_show('duobianx', img2)
show.cv_show('res', res2)

在这里插入图片描述
在这里插入图片描述
提取第一个轮廓

cnt = contours2[0]

面积

area = cv2.contourArea(cnt) 

在这里插入图片描述

周长

length = cv2.arcLength(cnt, True)  # 周长,True表示闭合

在这里插入图片描述

轮廓近似

设置一个阈值,越小越接近原轮廓

yuzhi = 0.01*cv2.arcLength(cnt, True)  # 阈值
approx = cv2.approxPolyDP(cnt, yuzhi, True)
draw_img2 = img2.copy()
res2 = cv2.drawContours(draw_img2, [approx], -1, (0, 0, 255), 2)
show.cv_show('res2', res2)

阈值为0.1倍周长时
在这里插入图片描述
阈值为0.01倍周长时
在这里插入图片描述

边界矩形

x, y, w, h = cv2.boundingRect(cnt)
ju = cv2.rectangle(img2, (x, y), (x+w, y+h), (0, 255, 0), 2)
show.cv_show('ju', ju)

在这里插入图片描述
轮廓面积与边界矩形面积之比

area2 = cv2.contourArea(cnt)
ju_area = w * h
bi = float(area2) / ju_area
print('轮廓面积与边界矩形面积之比', bi)

在这里插入图片描述

外接圆

(x, y), radius = cv2.minEnclosingCircle(cnt)
center = (int(x), int(y))
radius = int(radius)
yuan = cv2.circle(img2, center, radius, (0, 255, 0), 2)
show.cv_show('yuan', yuan)

在这里插入图片描述

http://www.lryc.cn/news/269740.html

相关文章:

  • 跟着LearnOpenGL学习11--材质
  • Java guava partition方法拆分集合自定义集合拆分方法
  • GLTF编辑器-位移贴图实现破碎的路面
  • 多维时序 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多变量时间序列预测
  • docker安装Nacos和Rabbitmq
  • Android MVC 写法
  • 网络层解读
  • js for和forEach 跳出循环 替代方案
  • 如何使用ArcGIS Pro自动矢量化建筑
  • 交互式笔记Jupyter Notebook本地部署并实现公网远程访问内网服务器
  • 41.坑王驾到第七期:uniapp开发微信小程序引用组件时报错!
  • 挂载与解挂载
  • UGUI Panel的显示和隐藏优化
  • Linux:多文件编辑
  • 模式识别与机器学习-概率图模型
  • RK3566 ANDROID 11 平台上适配移远EC200A
  • 存算分离降本增效,StarRocks 助力聚水潭 SaaS 业务服务化升级
  • Linux 内核学习笔记: hlist 的理解
  • 几种设计模式介绍
  • 拓展操作(三) jenkins迁移到另一个机器
  • 重定向和转发的区别
  • 基于ElementUI二次封装弹窗组件
  • linux cat命令改变功能显示当前文件行号
  • Django-REST-Framework 如何快速生成Swagger, ReDoc格式的 REST API 文档
  • SpringBoot当中的Singleton和Prototype详解
  • LeetCode第1题 - 两数之和
  • (14)Linux 地址空间的理解
  • Java中的设计模式
  • Hadoop(2):常见的MapReduce[在Ubuntu中运行!]
  • Unity | 快速修复Animation missing错误