python3环境下使用opencv3实现边缘检测
1、边缘检测有多种方法,一般步骤为:1)高斯模糊2)灰度筐毙险裆变化3)梯度检测4)输出或得出结论进行下一步处理。本文限于篇幅,使用最经典的索贝尔(sobel)算子实现梯度计算。高斯模糊也不予考虑。 Sobel算子结合高斯平滑与微分求导,抗噪声能力强,效率较高,对细纹理处理一般。用于计算图像灰度函数的近似梯度。利用导数求解边缘,像素差别大则切点越陡峭。也符合边缘特征(阶跃,屋顶) 它包含两组3x3的矩阵(横向及纵向模板),算子和图像作平面卷积分别得出横向及纵向的亮度差分近似值。
2、为了简单,自己构建了一稍僚敉视个米框图,便于观察!import cv2 as cvimport numpy as npimport matplotlib.pyplot as pltimage = cv.imread('c:\\black_MiLine.png',0)cv.imshow('image',image)cv.waitKey(0)
3、采用函数简介Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])进行计算。src: 图像;ddepth:图像的深度,-1表示与原图像相同深度。(目标图像的深度必须大于等于原图像的深度);dx和dy表示的是求导的阶数,0表示这个方向上没有求导(一般为0、1、2);ksize是Sobel算子的大小,必须为1、3、5、7;scale是缩放导数的比例常数,默认无伸缩系数;delta是可选增量,会加到最终dst,默认无额外的值加入dst;borderType 图像边界的模式 默认值为cv.BORDER_DEFAULT。----------------------------------------------------------------------计算sobelx检查该方向变化sobelx = cv.Sobel(image, cv.CV_64F, 1, 0, ksize=3)cv.imshow('sobelx',sobelx)Scale_absX = cv.convertScaleAbs(sobelx)print(Scale_absX)根据图像可看出成功检测非水平的边缘!
4、计算sobely检查该方向变化sobely = cv.Sobel(image, cv.CV_64F, 0, 1, ksize=3)cv.imshow('sobely',sobely)Scale_absY = cv.convertScaleAbs(sobely)print(Scale_absY)
5、同时检测XY方向sobelxy = cv.Sobel(image, cv.CV_64F, 1, 1, ksize=3)cv.imshow('sobelxy',sobelxy)cv.waitKey(0)水平垂直都没了! 有效果!
6、配重后输出:这个是没有convertScaleAbs的数值:result0 = cv.addWeighted(sobelx, 0.5, sobely, 0.5, 0)cv.imshow('result0',result0)
7、配重后输出:这个是有convertScaleAbs的数值:result1 = cv.addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0)cv.imshow('result1',result1)cv.waitKey(0)对比两种情况结果 发现convertScaleAbs处理后的在本例效果好一些