图像轮廓提取

这篇具有很好参考价值的文章主要介绍了图像轮廓提取。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、轮廓提取

轮廓提取是提取出图像的外部轮廓特征,轮廓可能是边缘的一部分。

2、轮廓提取方法及Python实现

2.1 掏空内部点法

掏空内部点法的原理非常简单:如果原图中有一点为黑,且它的8个相邻点皆为黑色,则将该点删除,否则认为该点在图像的边缘,需要保留。依次处理图像中每一个像素,则最后留下来的就是图像的轮廓。对于非二值图像,需要先进行二值化处理。
代码如下:

def Get_contour(bin_img):
    contour_img = np.zeros(shape=(bin_img.shape),dtype=np.uint8)
    contour_img += 255
    h = bin_img.shape[0]
    w = bin_img.shape[1]
    for i in range(1,h-1):
        for j in range(1,w-1):
            if(bin_img[i][j]==0):
                contour_img[i][j] = 0
                sum = 0
                sum += bin_img[i - 1][j + 1]
                sum += bin_img[i][j + 1]
                sum += bin_img[i + 1][j + 1]
                sum += bin_img[i - 1][j]
                sum += bin_img[i + 1][j]
                sum += bin_img[i - 1][j - 1]
                sum += bin_img[i][j - 1]
                sum += bin_img[i + 1][j - 1]
                if sum ==  0:
                    contour_img[i][j] = 255

    return contour_img

效果如下(左侧是Otsu二值化图像;右侧是轮廓图像):
图像轮廓提取

2.2 opencv-python中轮廓提取方法的应用

(1)opencv-python中使用cv2.findContours函数来检测图像的边缘,其函数原型如下:

contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

参数说明如下:
image:输入图像;
mode:轮廓检索模式;
method:轮廓逼近方法;
contours:返回的轮廓;
hierachy:每条轮廓对应的属性;
offset:每个轮廓点移动的可选偏移量。
备注:image参数需要是二值图,而不是灰度图,返回结果是等高线和层次结构。

轮廓检索模式:
cv2.RETR_EXTERNAL:表示只检测外轮廓;
cv2.RETR_LIST:检测的轮廓,不建立等级关系;
cv2.RETR_CCOMP:建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层;
cv2.RETR_TREE:建立一个等级树结构的轮廓。

轮廓逼近方法:
cv2.CHAIN_APPROX_NONE:存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即 max(abs(x1-x2),abs(y2-y1))==1,一般不会用到;
cv2.CHAIN_APPROX_SIMPLE:压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息;
cv2.CHAIN_APPROX_TC89_L1,cv2.CV_CHAIN_APPROX_TC89_KCOS:使用teh-Chinl chain近似算法。

(2)轮廓发现之后,还要通过cv2.drawContours函数绘制轮廓,其函数原型如下:

image = cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])

参数说明如下:
image:输入图像;
contours:轮廓,在Python中是一个list,就是cv2.findContours函数找出来的点集,一个列表;
contourIdx:轮廓的索引,指定绘制轮廓list中的哪条轮廓,要绘制所有轮廓,传递-1;
color:颜色;
thickness:厚度,如果是-1,表示填充;
lineType:线型;
hierarchy:层次结构的可选信息;
maxLevel:绘制轮廓的最大级别,0:仅绘制指定的轮廓,1:绘制轮廓和所有嵌套轮廓,2:绘制轮廓,所有嵌套轮廓,所有嵌套到嵌套的轮廓;
offset:轮廓偏移参数。

根据上面两个函数,测试代码如下:

# 第一步:读入图像
img = cv2.imread('lenna.jpg')

# 第二步:对图像做灰度处理
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 第三步:对图像做二值化处理
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# 第四步:获得图像的轮廓值
contours, heriachy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

# 第五步:绘制图像轮廓
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
res = cv2.drawContours(img, contours, -1, (0, 0, 255), 1)

plt.imshow(res, cmap='gray')
plt.title('contour')
plt.axis('off')
plt.show()

效果如下:
图像轮廓提取

3. 源码仓库地址

🌼图像处理、机器学习的常用算法汇总文章来源地址https://www.toymoban.com/news/detail-492157.html

到了这里,关于图像轮廓提取的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机视觉】不来试试图片轮廓提取?

    最近学到了深度学习的卷积操作,在卷积神经网络出现之前,就已经有使用卷积核 (也叫滤波器) ,但那时的卷积核依靠 人工的经验和知识 来进行设计,而不能像卷积神经网络中那样让机器自己学习出合适的卷积核参数。 下面就介绍通过卷积来获取图像 轮廓图 的操作。

    2023年04月08日
    浏览(71)
  • Halcon中亚像素边缘,轮廓提取处理的各种方法

    在图像处理中,提取图像特征主要从两个角度,区域或者边缘。提取亚像素边缘有三种思路,提取过后再用边缘模板匹配,连接与分割都可以。这里不涉及边缘对用作视觉测量类的算子,仅对刚学习halcon的新人而言。 这幅图代表着在项目的过程中使用边缘的三种思路。之前某

    2024年02月14日
    浏览(34)
  • 关于uniapp中使用opencv.js拍照提取纸张轮廓

    1.效果图片 2.下载opencv.js   比如下载 4.5.0 版本的 opencv.js 文件 https://docs.opencv.org/4.5.0/opencv.js 3.引入 opencv.js放在static文件夹下 页面中引入 let cv = require(\\\'../../static/opencv/opencv.js\\\'); 4.进入正题    //页面先放一个隐藏图片     img id=\\\"imageUrl\\\" alt=\\\"No Image\\\" style=\\\"display: none;\\\" /    //获取

    2024年02月04日
    浏览(36)
  • 全国主要城市建筑轮廓(含层高)矢量数据分享及最新AI提取建筑分布方法介绍

    今天要给大家带来的数据就是全国主要大中型城市的城市建筑轮廓矢量数据!!同时给大家一个傻瓜式的建筑物提取软件,以及其使用方法!! 一、数据基本情况 建筑轮廓数据实际上就是建筑的边界矢量数据,一般该数据属性中会记录对应建筑的高度或者楼层数,通过建筑

    2024年02月12日
    浏览(56)
  • c# opencv 找到图像的轮廓,并绘制轮廓

    原图                                                                                结果图                                                                  本意是想去除白色图像周边的几个白色小点,得到轮廓图后,其他都设置为黑色,结果是白点更明

    2024年02月13日
    浏览(89)
  • 使用Python绘制粽子消消乐,素描图(优化版,正常/漫画/写实风格),词云图,字符画图及提取轮廓

    这篇博客将介绍如何使用Python绘制粽子消消乐,素描图(优化版,正常/漫画/写实风格),词云图,字符画图及提取轮廓。 使用Python绘制端午dragboat消消乐 美轮美奂的界面效果 选了我最爱的小林老师的漫画图~ 纵有千种风情,更与谁人说。 端午粽子原始图VS素描图: 端午粽子

    2024年02月08日
    浏览(46)
  • opencv基础53-图像轮廓06-判断像素点与轮廓的关系(轮廓内,轮廓上,轮廓外)cv2.pointPolygonTest()

    在 OpenCV 中,函数 cv2.pointPolygonTest()被用来计算点到多边形(轮廓)的最短距离(也 就是垂线距离),这个计算过程又称点和多边形的关系测试。该函数的语法格式为: retval = cv2.pointPolygonTest( contour, pt, measureDist ) 式中的返回值为 retval,与参数 measureDist 的值有关。 式中的参数

    2024年02月13日
    浏览(37)
  • OpenCv之图像轮廓(二)

    目录 一、多边形逼近 二、凸包  三、最小外接矩形与最大外接矩形 参照函数: approxPolyDP就是以多边形去逼近轮廓,采用的是Douglas-Peucker算法(DP) DP算法原理比较简单,核心就是不断找多边形最远的点加入形成新的多边形,直到最短距离小于指定的精度。 案例代码如下: 运行结

    2024年02月17日
    浏览(45)
  • 7.OpenCV-图像轮廓

    1.通过OpenCV的findContours可以很方便的找到图片中内容的轮廓。 2.为了提取轮廓有更高的准确率,在提取轮廓前,需要对图片进行预处理(二值+阈值),只保留感兴趣的图像。 3.通过计算轮廓面积与外接矩形或外接圆的面积,可以找到轮廓特征,进一步筛选出感兴趣的轮廓。

    2024年02月09日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包