首页 > 编程知识 正文

opencv像识别库创建,opencv像轮廓提取原理

时间:2023-05-03 18:43:07 阅读:177816 作者:1936

金字塔图像金字塔是由具有一个图像的多个不同分辨率的子图组成的图像集合。 这组图像是通过对一个图像连续进行下采样生成的,最小的图像可能只有一个像素点。 金字塔的分辨率从低到上逐渐降低

通常,图像金字塔的底部是要处理的高分辨率图像(原始图像),顶部是低分辨率的近似图像,通常每向上移动一级,图像的高度和宽度就会降低一半,大小为1/4

理论金字塔图像是通过对原始图像进行下采样而生成的。 也就是说,从高分辨率的图像中生成低分辨率的近似图像。

简单的图像金字塔可以通过不断删除图像的偶数行和偶数列获得。 也可以对原图像进行滤波,得到原图像的近似图像,然后删除近似图像的偶数行偶数列。 可以从以下选项中选择过滤器:

邻域滤波器可使用邻域平均技术生成平均金字塔的花痴大神滤波器。 获得花痴大神金字塔是cv2.pyrDown ()采用的方式

在向上采用中,为了将尺寸扩大到4倍,需要插值处理、最接近插值方法等。 常见的是补零方法,通常还会在每行像素点的右侧插入0列,并插入每行下方。

另外,使用花痴大神滤波器对校正了零的图像进行滤波处理并下采样时,图像被放大为4倍,像素点的四分之三的值都为0。 直接花痴大神滤波获得的值范围为[ 0,255 *1/4],因此需要将花痴大神滤波的系数乘以4或乘以图像值,以使得像素值范围与原始图像一致。 请参阅。 不知道怎么理解,还有向上、向下两个操作是不可逆的,他们得到的图像也不能恢复到原来的状态了

pyrDown函数和应用dst=cv2.pyrdown(src[,dstsize[,borderType]] ) )这实现了下采样

dstsize目标图像的默认大小为size((src.cols1)/2,).rows1)/2 )

下采样会降低图像的分辨率。 也就是说,会模糊。 请参阅。

pyrUp函数和应用dst=cv2.pyrup(src (,dstsize[ ),borderType]] ) )实现图像金字塔的上采样

默认情况下,目标图像的大小为size(src.cols2,src.rows2),它将花痴大神滤镜的系数乘以4,但Opencv库的目的是忽略这些细节,因此不需要太在意原因请参阅。

用o=cv2.imread(5.jpg ) ) r1=cv2.pyrUp(o ) o ) R2=cv2.pyrdown ) R1 ) diff=r2-o #制作diff图像,down和o之间的差异cv2

当然,放大会模糊,放大缩小不会恢复原始图像的分辨率。 右图表示与扩大缩小后的原图像的像素值的插补。

智能世界金字塔这是对金字塔的小图像进行上采样以获取完整的大尺寸高分辨率图像

对图像进行下采样时,信息一定会丢失。 上采样不会恢复。 需要获取重新采样过程中丢失的信息,以便在上采样时可以恢复。 这个丢失的信息,聪明的世界金字塔Li=gi-pyrup(gi1 ) Li Gi分别构成聪明的世界金字塔和花痴的大神金字塔。

伶俐的世界金字塔第I层,与“花痴大神金字塔第I层”和“花痴大神金字塔第i 1层上采样结果”之差相等。

问题是图像的大小问题,如果不是偶数的话最后不能减少。例如,(707,500,3 )通过一次向下然后向上)就会变为(708,500,3 )。 请参阅。 这个不能减去。 只能修改尺寸了吧。 请参阅。

聪明的世界金字塔的作用是能够恢复高分辨率的图像,将G1和L0相加可以得到高分辨率的G0

o=cv2.imread(14.jpg ) ) G0=og1=cv2.pyrdown ) G0 ) G2.pyrdown ) G1 )构建花痴大神金字塔G3=cv2.pyrdown ) G2 )的优势人物实际上是上式的转移项print('g0.shape=',G0.shape ) print ) ) G0.shape ),减去RG0.shape(result=rG0-G0 ) RG0和G0得到的resess 请参阅。 使用智能世界金字塔恢复的图像与原始图像完全一致。

图像轮廓的边缘检测可以检测边缘,但边缘是不连续的,检测到的边缘不一定是整体。 图像轮廓是指将边缘连接起来的整体,在后面使用

续的计算。使用 cv2.findCountours() 来查找轮廓, cv2.drawContours() 绘制轮廓。图像轮廓是图像中非常重要的一个特征信息,通过对图像轮廓的操作,可以获取目标图像的大小,位置方向等信息。、

查找并绘制图像

一个轮廓对应一系列的点,这些点以某种方式表示图像的一条曲线,findContours() 用于查找图像的轮廓,并可以根据参数返回特定表示方式的轮廓,drawContours() 可以将查找的轮廓绘制到图像上,可以根据参数绘制不同样式的轮廓(实心空心,线条粗细颜色等),可以绘制全部轮廓也可以绘制部分。

查找图像轮廓:findContours函数

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

image 返回的原始图像contours 返回的轮廓hierarchy 图像的拓扑信息(轮廓层次)image 原始图像,8位单通道,要处理为二值图mode 轮廓检索模式method 轮廓的近似方法 返回值contours 返回一组轮廓信息,每个轮廓都是由若干个点构成,例如contours[i] 是第i个轮廓,contours[i][j] 是第i 个轮廓的第J 个点

contours的基本属性: type 返回值contours 的type属性是列表,每一个元素都是一个轮廓,用Numpy 的 ndarray 结构表示len(contours) 获得轮廓个数(len(contours[0]) 第零个轮廓右多少点数,(contours[0].shape 获得每个轮廓内点的shape 属性 ,比如那个正方形的shape 属性就是 (4,1,2) print(contours[0]) 打印第 0 个轮廓的像素点
[[[ 79 270]]
[[ 79 383]]
[[195 383]]
[[195 270]]] 只有四个点 返回值 hierarchy ,图像内的轮廓可能位于不同的位置,比如一个轮廓再另一个轮廓的内部。外轮廓称为父轮廓,内部的就是子轮廓,根据轮廓之间的关系就可以确定一个轮廓和其他轮廓是如何连接的,比如,确定一个轮廓是某个轮廓的子轮廓,或是某个轮廓的父轮廓,上述关系称为层次(组织结构),返回值 hierarchy 就包含上述层次关系。

每个轮廓 contours[i] 对应4个元素来说明当前轮廓的层次关系[Next,Previous,First_Child,Parent]

Next ,后一个轮廓索引编号Previous 前一个轮廓索引编号First_Child 第一个子轮廓的索引编号Parent 父轮廓的索引编号,,如果各个参数没有对应的关系,就将参数设置为-1.

print(hierarchy) 来查看hierarchy 的值,需要注意轮廓的层次结构是由参数 mode 决定的,不同的 mode 得到的轮廓的编号不一样,hierachy 也不一样。

image 输入图像,必须是8位单通道二值图mode 决定了轮廓的提取方式

cv2.RETR_EXTERNAL:只检测外轮廓。

输出值 [1,-1,-1,-1] 表示第零个轮廓的层次,后一个轮廓是第一个轮廓,前一个轮廓不存在所以两个 -1,不存在父轮廓,第四个参数也是 -1. [ -1 0 -1 -1] 同理,后一个轮廓不存在,前一个轮廓是0,不存在父子轮廓。

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

这里就检测出来三个轮廓,由于不建立等级关系,所以没有父子轮廓。

cv2.RETR_CCOMP:检索所有轮廓并将它们组织成两级层次结构。上面的一层为外边界,下面的一层为内孔的边界。如果内孔内还有一个连通物体,那么这个物体的边界仍然位于顶层。


额,这前一个轮廓就很迷,应该是说同一个层级的前一个轮廓吧,,上面的都是一个层级,这有两个了、

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

由于这个图像就有两层轮廓,所以 cv2.RETR_CCOMP 和 cv2.RETR_TREE 得到的层级结构是一样的,但有多层级时,前者就会得到两层,后者可以获得多层。 参数method 这个决定了如果表达轮廓, cv2.CHAIN_APPROX_CONE 存储所有轮廓点,相邻两个点的像素位置差不超过1,cv2.CHAIN_APPROX_SIMPLE 压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,极端情况下,四个点来保存一个矩形的轮廓信息cv2.CHAIN_APPROX_TC89_L1:使用 teh-Chinl chain 近似算法的一种风格。cv2.CHAIN_APPROX_TC89_KCOS:使用 teh-Chinl chain 近似算法的一种风格。

细看,,蓝色的边就是保存的轮廓,使用第一个方法保留所有的点,第二个参数就保留边界上的四个点。

使用 cv2.findContours() 查找图像轮廓时,需要注意:

处理的必须时灰度二值图再Oepncv中都是从黑色背景中查找白色对象,因此对象必须是白色的,背景必须是黑色的4.X 版本中,函数仅返回两个个值。 绘制图像轮廓:drawContours函数

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

image 待绘制轮廓的图像,注意函数会在图像上直接绘制轮廓,也就是函数执行完后,image 不再是原始图像了,而是包含了轮廓的图像。所有记得复制一份图像contours 需要绘制的轮廓,该参数的类型与函数 cv2.findContours()的输出 contours 相同,都是 list 类型contourIdx 需要绘制的边缘索引,告诉函数是要绘制一条轮廓还是所有轮廓,如果是个整数或0,表示绘制对应索引号的轮廓,如果值为-1 ,绘制全部轮廓color 绘制的颜色,RGB 格式表示,十六机制的嘛?thickness 可选,表示绘制轮廓使用的画笔粗细,,,-1表示绘制实心轮廓lineType 可选,绘制轮廓的线类型,具体介绍以后再说,,hierarchy 对应函数 cv2.findContours()所输出的层次信息maxLevel 控制绘制的轮廓层次的深度,如果为0,仅绘制第零层的轮廓,如果是其他正数,绘制最高层以下的层级轮廓。offset:偏移参数。该参数使轮廓偏移到不同的位置展示出来由于直接作用再原图上,所有不写返回值也是可以的。 实例 import cv2o = cv2.imread('12.jpg') cv2.imshow("original",o)gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY) # 转换为灰度二值图ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY) contours, hierarchy = cv2.findContours(binary, # 找边界 cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) o=cv2.drawContours(o,contours,-1,(0,0,255),5) # 绘制边界,红色,画笔粗细为5cv2.imshow("result",o) cv2.waitKey()cv2.destroyAllWindows()


太厉害了吧///

import numpy as npo = cv2.imread('16.jpg') cv2.imshow("original",o) # 逐个显示一副图像内的边缘信息。gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY) ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY) contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) n=len(contours)contoursImg=[]for i in range(n): temp=np.zeros(o.shape,np.uint8) contoursImg.append(temp) contoursImg[i]=cv2.drawContours(contoursImg[i],contours,i,(255,255,255),5) cv2.imshow("contours[" + str(i)+"]",contoursImg[i]) cv2.waitKey()cv2.destroyAllWindows()

o = cv2.imread('6.jpg')cv2.imshow("original",o) gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY) ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY) contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) mask=np.zeros(o.shape,np.uint8)mask=cv2.drawContours(mask,contours,-1,(255,255,255),-1) # thickness设置为-1,绘制前景对象的实心轮廓cv2.imshow("mask" ,mask)loc=cv2.bitwise_and(o,mask) # 实现轮廓与原始图像进行按位与,可以将前景对象从原始图像中提取出来cv2.imshow("location" ,loc)cv2.waitKey()cv2.destroyAllWindows()


就这个效果,,,感觉跟掩模一样。。。。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。