OpenCV关于图片语法(边缘检测)小结③

慢慢学着学着发现opencv语法太丰富了,附opencv官方英文文档

1.cv2.GaussianBlur()

C++:

void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT )

Python:

cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) → dst

参数解释;
*src—输入图像;图像可以具有任意数量的通道,这些通道可以独立处理,但深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。
*dst—输出图像的大小和类型与src相同。
*ksize—高斯内核大小。 ksize.width和ksize.height可以不同,但​​它们都必须为正数和奇数,也
可以为零,然后根据sigma计算得出。
*sigmaX— X方向上的高斯核标准偏差。
*sigmaY— Y方向上的高斯核标准偏差。如果sigmaY为零,则将其设置为等于sigmaX;如果两个sigmas为零,则分别从ksize.width和ksize.height计算得出;为了完全控制结果,而不管将来可能对所有这些语义进行的修改,建议指定所有ksize,sigmaX和sigmaY。
*borderType—像素外推方法
例如:

imgBlur = cv2.GaussianBlur(imgGray,(5,5),1)#(5, 5)表示高斯矩阵的长与宽都是5,标准差取1

滤波(blur)操作是一种基于邻域的图像平滑方法详细看下面这位的解释:高斯

2.cv2.Canny()

cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]]) 

参数解释;
① image:要检测的图像
② threshold1:阈值1(最小值)
③ threshold2:阈值2(最大值),使用此参数进行明显的边缘检测
④ edges:图像边缘信息
⑤ apertureSize:sobel算子(卷积核)大小
⑥ L2gradient :布尔值。
⑦ True: 使用更精确的L2范数进行计算(即两个方向的导数的平方和再开方)
⑧ False:使用L1范数(直接将两个方向导数的绝对值相加)
作用略述
阈值2进行明显的边缘检测,阈值1进行连接
卷积核越大,细节越多
flase细节明显

3.cv2.erode()

cv2.erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)

参数解释;
① src:输入图像.通道的数量可以是任意的,但深度应该是CV_8U、CV_16U、CV_16S、CV_32F 或 CV_64F。
② kernel:用于腐蚀的内核结构元素。一般为奇数(3,3)、(5,5)的卷积核等等
③ dst:输出与 src 大小和类型相同的图像
④ anchor:元素内锚点的锚点位置;默认值 (-1, -1) 表示锚点位于元素中心。
⑤ iterations:迭代应用侵蚀的次数
⑥ borderType:像素外推方法
⑦ borderValue:边界的值为恒定的值
作用略述
取最小值的像素邻域的形状

4.cv2.dilate()

cv2.dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)

参数解释;
① anchor:元素内锚点的锚点位置;默认值 (-1, -1) 表示锚点位于元素中心。
② iterations:迭代应用膨胀的次数
作用略述
取最大值的像素邻域的形状

5.cv2.findContours()

findContours(image, mode, method, contours=None, hierarchy=None, offset=None): 

参数解释;
① mode:
cv2.RETR_EXTERNAL 只检测外轮廓
cv2.RETR_LIST 检测的轮廓不建立等级关系,都是同级
cv2.RETR_CCOMP 建立两个等级的轮廓,上面一层为外边界,里面一层为内孔的边界信息
cv2.RETR_TREE 建立一个等级树结构的轮廓
② method:
cv2.CHAIN_APPROX_NONE 存储所有边界点
cv2.CHAIN_APPROX_SIMPLE 压缩垂直、水平、对角方向,只保留端点
cv2.CHAIN_APPROX_TX89_L1 使用teh-Chini近似算法
cv2.CHAIN_APPROX_TC89_KCOS 使用teh-Chini近似算法
作用略述
返回一个list,list中每个元素都是图像中的一个轮廓,用numpy中的ndarray表示。
这个没有理解很深,后续找找有没有实战的例子。

6.cv2.drawContours

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

参数解释;
① image 要检测的图像。
② contours 所有输入轮廓。每个轮廓都存储为点向量。
③ contourIdx 参数表示要绘制的轮廓。如果是负数,则绘制所有轮廓。
④ color 轮廓的颜色。
⑤ thickness 轮廓绘制的线条厚度。如果它是负的(例如thickness=CV_FILLED),轮廓内饰被绘制。
⑥ lineType 线路连接。。
⑦ hierarchy 有关层次结构的可选信息。它只需要,如果你想画一些轮廓(maxlevel)。
⑧ maxlevel 绘制轮廓的最大水平 。如果是 0,则只绘制指定的轮廓。如果是 1,则函数绘制轮廓和所有嵌套轮廓。如果是 2,则函数绘制轮廓、所有嵌套轮廓、所有嵌套到嵌套轮廓等。此参数仅在可用的层次结构(hierarchy)时考虑。
⑨ offset 可选轮廓移位参数。将所有绘制的轮廓按指定的轮廓移动。
⑩ contour指向第一个轮廓的指点。
① externalColor 外部轮廓的颜色。
② holeColor 内部轮廓的颜色(孔)。
作用略述
画图象,关于嵌套说明,以后再说。

其实这就是canny算法边缘检测的整体思路

转换成灰度图
高斯模糊,去除噪点
max 和 min 限制边缘
可以在后面加上膨胀 腐蚀

不带5,6点的实战

图片:
请添加图片描述
代码:

mport cv2
import numpy as np
webcam = False
path = '5.png'
img = cv2.imread(path)

imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray, (5, 5), 1)  # (5, 5)表示高斯矩阵的长与宽都是5,标准差取0
imgCanny = cv2.Canny(imgBlur, 100,100,apertureSize=3)
kernel = np.ones((5, 5))  # 做一个矩阵,作为膨胀腐蚀的内核
imgDial = cv2.dilate(imgCanny, kernel, iterations=3)  # 膨胀
imgThre = cv2.erode(imgDial, kernel, iterations=2)  # 腐蚀

cv2.imshow('Canny', imgThre)
cv2.waitKey(0)
cv2.destroyAllWindows()

原图:

请添加图片描述

带5,6点的实战(多了绘制)

图片:
请添加图片描述

代码:

import cv2
import numpy as np

path = '5.png'
img = cv2.imread(path)
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
imgBlur = cv2.GaussianBlur(imgGray, (5, 5), 1)  # (5, 5)表示高斯矩阵的长与宽都是5,标准差取0
imgCanny = cv2.Canny(imgBlur, 100,100,apertureSize=3)
kernel = np.ones((5, 5))  # 做一个矩阵,作为膨胀腐蚀的内核
imgDial = cv2.dilate(imgCanny, kernel, iterations=3)  # 膨胀
imgThre = cv2.erode(imgDial, kernel, iterations=2)  # 腐蚀

contours, hierarchy = cv2.findContours(imgThre, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 0, 255), 3)

cv2.imshow("img", img)
cv2.waitKey(0)

篇幅过长见我下篇文章
重点来了

qq群:533421326

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值