慢慢学着学着发现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