matlab二值图像轮廓坐标_14. OpenCV--轮廓发现 & 轮廓测量

这篇博客介绍了如何在MATLAB中利用OpenCV进行二值图像的轮廓检测。首先,通过Canny边缘检测获取二值图像,接着使用findContours找到轮廓,并用drawContours绘制。文章讨论了不同轮廓检索模式和近似方法,以及如何通过高斯模糊减少噪点。最后,探讨了如何利用轮廓信息进行对象测量,如面积和周长计算。
摘要由CSDN通过智能技术生成

》》点赞,收藏+关注,理财&技术不迷路《《

目录:

f6378c47e0bdc24c6ceb30a1247e75ed.png

14.1 轮廓发现介绍

轮廓发现基于二值图像,二值图像通过边缘提取(canny)来得到。

轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果。

我们通过阈值分割提取到图像中的目标物体后,我们就需要通过边缘检测来提取目标物体的轮廓,使用这两种方法基本能够确定物体的边缘或者前景。接下来,我们通常需要做的是拟合这些边缘的前景,如拟合出包含前景或者边缘像素点的最小外包矩形、圆、凸包等几何形状,为计算它们的面积或者模板匹配等操作打下坚实的基础。

操作步骤:

输入图像转为灰度图像

使用Canny进行边缘提取,得到二值图像

使用findContours寻找轮廓

使用drawContours绘制轮廓

14.2 API介绍与举例

相关API:

findContours发现轮廓

drawContours绘制轮廓

findContours( InputOutputArray image, OutputArrayOfArrays contours,OutputArray hierarchy, int mode,int method, Point offset=Point());

opencv2返回两个值:contours:hierarchy。注:opencv3会返回三个值,分别是img, countours, hierarchy

参数:

第一个参数是寻找轮廓的图像;

第二个参数表示轮廓的检索模式,有四种(本文介绍的都是新的cv2接口):

cv2.RETR_EXTERNAL表示只检测外轮廓

cv2.RETR_LIST检测的轮廓不建立等级关系

cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。

cv2.RETR_TREE建立一个等级树结构的轮廓。

第三个参数method为轮廓的近似办法

cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1

cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息

cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法

返回值:

cv2.findContours()函数返回两个值,一个是轮廓本身,还有一个是每条轮廓对应的属性。

findcontours 可以接受两种图像,二值图像和梯度图像。所以看情况而定我们是用梯度还是二值,看看哪个效果更好

14.2.1 轮廓发现与降噪(梯度图像方法)

db8bb38869ad86bbe3cbfda1f4eda2ab.png

fa6c0eb19ba548e3eec889ae7a4bceda.png

运行后会发现二值化图中有一些小的噪点(虽然难得看出来),但是在第三幅图中明显可以看出硬币中的噪点。

为了消除这些噪点,我们先用一个 3*3 的高斯模糊滑一下。

e50f3e3a28ec811e404342406b4af40e.png

先通过高斯模糊后,可以看得出来噪点少了很多。

想完全除去硬币中噪点,可以换成EXTERNAL。

ecd34af7338c8e5e6d78c02cf2a5f867.png

14.2.2 轮廓填充

a6e8414a966ce8486203c796775d6006.png

ed6cb368e162924d1ed8d04357f03a35.png

14.2.3 二值化方法(canny)

8079e073aff3162b007d6920d3fbc2ef.png


所以说contours 可以用两种方法,梯度图像和二值化图像,明显在这个例子中梯度图像要优于二值化图像。

14.3 对象测量

我们找到了轮廓,然后我们怎么测量面积?弧长?周长?

图像计算出来的弧长和面积都是像素为单位的,需要换算一下变成度量单位。

3b5e4fcb890b9c451c74fc59eb0c0cdc.png

数字里面 1 是最容易找到的。

8a9de68fabe7bf7b06298857b5789ee1.png

e419f41777490eaf71369124ce01c2f3.png
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
获取二值图像轮廓及中心点坐标的代码如下: ```python import cv2 # 读取二值图像 img = cv2.imread('binary_image.png', cv2.IMREAD_GRAYSCALE) # 获取轮廓 contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 获取轮廓中心点坐标 center_points = [] for contour in contours: moments = cv2.moments(contour) cX = int(moments["m10"] / moments["m00"]) cY = int(moments["m01"] / moments["m00"]) center_points.append((cX, cY)) # 在原图上绘制轮廓及中心点 color_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) cv2.drawContours(color_img, contours, -1, (0, 255, 0), 2) for center_point in center_points: cv2.circle(color_img, center_point, 3, (0, 0, 255), -1) # 显示原图、二值图、轮廓及中心点 cv2.imshow('original image', cv2.imread('original_image.png')) cv2.imshow('binary image', img) cv2.imshow('contours and center points', color_img) cv2.waitKey(0) ``` 其中,`cv2.findContours()` 函数用于获取轮廓,参数解释如下: - 第一个参数是二值化的图像,即只有黑色和白色两种颜色。 - 第二个参数是轮廓检索模式,`cv2.RETR_EXTERNAL` 表示只检索最外层轮廓。 - 第三个参数是轮廓逼近方法,`cv2.CHAIN_APPROX_SIMPLE` 表示只保留轮廓的端点。 `cv2.moments()` 函数用于计算轮廓的矩,从而得到轮廓的中心点坐标。其中,`moments["m00"]` 表示轮廓的面积,`moments["m10"]` 和 `moments["m01"]` 分别表示轮廓的一阶矩,即 x 和 y 方向上的重心坐标。 最后,使用 `cv2.drawContours()` 函数在原图上绘制轮廓,并使用 `cv2.circle()` 函数在中心点处绘制红色圆圈。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值