文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python+OpenCV之图像轮廓详解

2024-04-02 19:55

关注

1. 图像轮廓

1.1 findContours介绍

cv2.findContours(img, mode, method)

mode:轮廓检索模式

method:轮廓逼近方法

1.2 绘制轮廓

import cv2


def cv_show(img, name):
    cv2.imshow(name, img)
    cv2.waitKey()
    cv2.destroyAllWindows()


img = cv2.imread('DataPreprocessing/img/contours.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
cv_show(thresh, 'thresh')

contours.png原图展示:

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)
cv_show(res, 'res')

“-1”表示显示所有轮廓,(B, G , R) = (0, 0, 255) 采用红色的显示全部轮廓,如下:

或者显示索引为1的轮廓,代码如下: 

draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, 1, (0, 0, 255), 2)
cv_show(res, 'res')

索引为1的是三角形的内轮廓,0是外轮廓:

1.3 轮廓特征

cnt = contours[0]

# 面积
print("面积: ", cv2.contourArea(cnt))

# 周长,True表示闭合的
print("周长: ", cv2.arcLength(cnt, True))

输出:

面积: 8500.5
周长: 437.9482651948929

2. 轮廓近似

2.1 轮廓

contours2.png原图 :

img = cv2.imread('DataPreprocessing/img/contours2.png')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cnt = contours[0]

draw_img = img.copy()
res = cv2.drawContours(draw_img, [cnt], -1, (0, 0, 255), 2)
cv_show(res, 'res')

边缘检测:

原理:以这个弧线为例, A , B A,B A,B端连线,取弧线上一点 C C C离线段 A B AB AB的距离最大,判断 d 1 d_{1} d1​是否小于设置的阈值 T T T, 不小于 T T T的,则以 A , C A,C A,C连接线段 A C AC AC,重复上面的操作,取得图中的 d 2 d_{2} d2​,再同 T T T做比较,直至 d n d_{n} dn​小于阈值得出线段为轮廓边缘。

2.2 边界矩形

img = cv2.imread('DataPreprocessing/img/contours.png')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
cnt = contours[0]

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

2.3 外界多边形及面积

area = cv2.contourArea(cnt)
x, y, w, h = cv2.boundingRect(cnt)
rect_area = w * h
extent = float(area) / rect_area
print('轮廓面积与边界矩形比', extent)	

输出:

轮廓面积与边界矩形比 0.5154317244724715

外接圆形:

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

结果展示:

到此这篇关于Python+OpenCV之图像轮廓详解的文章就介绍到这了,更多相关Python OpenCV图像轮廓内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯