图像轮廓之查找并绘制轮廓

图像轮廓之查找并绘制轮廓,第1张

  边缘检测虽然能够检测出边缘,但边缘是不连续的,检测到的边缘并不是一个整体。图像轮廓是指将边缘连接起来形成的一个整体,用于后续的计算。

  OpenCV提供了查找图像轮廓的函数cv2.findContours(),该函数能够查找图像内的轮廓信息,而函数cv2.drawContours()能够将轮廓绘制出来。

  图像轮廓是图像中非常重要的一个特征信息,通过对图像轮廓的 *** 作,我们能够获取目标图像的大小、位置、方向等信息。

函数cv2.findContours()的语法格式为:

式中的返回值为:

式中的参数为:

在OpenCV中,可以使用函数cv2.drawContours()绘制图像轮廓。该函数的语法格式是:

【例12.1】绘制一幅图像内的所有轮廓。

如果要绘制图像内的所有轮廓,需要将函数cv2.drawContours()的参数contourIdx的值设置为“-1”。

【例12.2】逐个显示一幅图像内拦祥毁的边缘信息。

【例12.3】使用轮廓绘制功能,提取前景对象。

将函数cv2.drawContours()的参数thickness的值设置为“-1”,可以绘制前景对象的实心轮廓。将该实心轮廓与原始图像进行“按位与” *** 简备作,即可将前景对象从原宴敬始图像中提取出来。

本例中将函数cv2.drawContours()的参数thickness设置为“-1”,得到了前景对象的实心轮廓mask。接下来,通过语句“cv2.bitwise_and(o, mask)”,将原始图像o与实心轮廓mask进行“按位与”运算,就得到了原始图像的前景对象。

clude<stdio.h>

int main()

{

int len=0

int len2=0

FILE* stream

FILE* stream1

FILE* stream2

char buf[50]

char buf1[50]

char buf2[50]

char text[1024]

printf("input anfile path to open:")

scanf("铅滚%s",buf)

stream=fopen(buf,"r+")

fseek(stream,0,SEEK_END)

len=ftell(stream)

printf("the file %s length is %d!\n",buf,len)

len2 = len/2

printf("intput 2 file name: \n")

scanf("%s%s",buf1,buf2)

fseek(stream,0,SEEK_SET)

stream1=fopen(buf1,"w+")

stream2=fopen(buf2,"w+")

fread(text,len2,1,stream)

fwrite(text,len2,1,stream1)

fread(text,len-len2,1,stream)

fwrite(text,len-len2,1,stream2)

fclose(stream)

fclose(stream1)

fclose(stream2)

return 0

}

文件合并

#include<stdio.h>

int main()

{

int len=0

int len2=0

FILE* stream

FILE* stream1

char buf[50]

char buf1[50]

char text[1024]

printf("input anfile path to open:")

scanf("%s",buf)

stream=fopen(buf,"乱激唤r+")

fseek(stream,0,SEEK_END)

printf("哗凯intput another file name: \n")

scanf("%s",buf1)

stream1=fopen(buf1,"r+")

fseek(stream1,0,SEEK_END)

len=ftell(stream1)

fseek(stream1,0,SEEK_SET)

fread(text,len,1,stream1)

fwrite(text,len,1,stream)

fclose(stream)

fclose(stream1)

remove(buf1)//remove the another file

return 0

}

需要在程序目录下有文件存在

边缘检测虽然能够检测出边缘,但是边缘不是连续的,检测到的边缘不是一个整体。 图像轮廓是指将边缘连接起来形成一个整体

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

cv2.RETR_EXTERNAL:只卖盯检测外轮廓

cv2.RETE_CCOMP:检测所有轮廓并组织成两级层次结构,上面一层为外边界,下面一层为内控的边界

(注:当含有多个层次结构时,其也只会得到两层的层次结构,而TREE会得到多层)

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

如何表达轮廓

cv2.CHAIN_APPROX_SIMPLE :压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点元素

cv2.CHAIN_APPROX_NONE:存储所有轮没仔廓点

返回值image:绘制了轮廓的图像

参数:

image:待绘制轮廓的图像,会在image上直接绘制,后续如果image原始图像有用,需要先复制备份

contours:需要绘制的轮廓

contourIdx:一个整数或者0,表示对应的索引号;-1表示绘制全部轮廓

thickness:-1,表示绘制实心轮廓

绘制一副图像中的所有轮廓

逐个显示一幅图像中的边缘信息

使用轮廓绘制功能,提取前景图像

比较两个轮廓最简单的方法是比较二者的轮廓矩。 轮廓矩代表了一个轮廓,一幅图像,一组点集的全部特征 ,矩信息包含了对应对象的不同类型的几何特征,例如大小,位置,角度,形状等。如果两个轮廓的矩一致,那么这两个轮廓就是一致的。

矩特征被广泛应用在 模式识别 图像识别 方面

空间矩(m00表示轮廓的面积)

中心矩(比较不同位置上两个对象的一致性)

归一化中心矩(不仅具有平移不变性,还具有缩放不变性)

array:可以是点集,灰度图像,二值图像

binaryImage: 该参数为True时 ,arry内所有的非零值被处理为1, 也就是二值化 仅在array为图像时有效

oriented:

True,返回值包含正负号,用来表示轮廓是顺时针还是逆时针

False,表示返回的retval是一个绝对值

closed:

True,轮廓封闭

False,轮廓不封闭

Hu矩是归一化中心矩的线性组合。 Hu矩在图像旋转,平移,缩放等 *** 作后,仍能保持矩的不变性 ,所以经常拿Hu矩作为识别图像的特征

其中,hu是表示返回的Hu矩值,m是由参数cv2.moments()计算得到的矩特征值

由于Hu矩的值本身就非常的小,因此这里没有发现两个对象的Hu矩差值的特殊意义

通过Hu矩来判断两个对象的一致性

其中 retval返回左上角顶点的x,y以及宽和高(x,y,w,h)

采用cv2.boundingRect()和cv2.rectangle()绘制矩形包围框

此处返回的[最小外接矩形中心,(宽,高),旋转角度],必须经过下面函数

此处的points值再经过np.int0()取整,可以应用于cv2.drawContours()

retval:最小外包三角枯配汪形的面积

triangle:最小外包三角形的三个顶点集

注意:三个顶点集的坐标必须转化为整数

返回值:逼近多边形的点集

参数:轮廓,原始轮廓边界点与逼近多边形边界之间的最大距离,True:封闭;False不封闭

DP算法:该算法首先从轮廓中找到距离最远的两个点,并且将两点相连。接下来在轮廓上找到一个距离当前直线最远的点,并且将该点与原有直线连成一个封闭多边形,上述过程不断迭代,将新的找到的距离当前多边形最远的点加入到结果中。当轮廓上所有的点到当前多边形的距离都小于函数cv2.approxPolyDP()的参数epsilon的值时,就停止迭代

构造不同精度的逼近多边形


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12497838.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存