慢慢学着学着发现opencv语法太丰富了 附opencv官方英文文档
1.cv2.GaussianBlurC
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细节明显
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:边界的值为恒定的值
作用略述
取最小值的像素邻域的形状
cv2.dilate(src, kernel, dst None, anchor None, iterations None, borderType None, borderValue None)
参数解释
① anchor:元素内锚点的锚点位置 默认值 (-1, -1) 表示锚点位于元素中心。
② iterations:迭代应用膨胀的次数
作用略述
取最大值的像素邻域的形状
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表示。
这个没有理解很深 后续找找有没有实战的例子。
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 限制边缘
可以在后面加上膨胀 腐蚀
图片
代码
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()
原图



