边缘检测
边缘检测步骤:
1)、滤波:边缘检测一般是使用图像的一阶或二阶导数求极值来确定图像的边缘。由于导数对图像的噪声很敏感,因此用滤波器来改善或消除噪声的影响。常见的处理方法是采用高斯滤波(归一化)。
2)、图像边缘增强:增强算法可以将图像灰度点邻域强度值有显著变化的点凸显出来。可通过梯度的幅值来确定。
3)、检测:经过增强的图像,往往邻域中很多点的梯度值比较大,但在特定的环境中,并不是要找的边缘点。所以采取某种方法进行取舍。
边缘检测算子
1、canny算子
canny边缘检测步骤:
1、消除噪声
使用高斯平滑滤波器卷积降噪。
2、计算梯度幅值和方向
3、非极大值抑制
排除边缘像素,仅仅保留一些候选边缘
4、滞后阈值
使用两个阈值对候选边缘像素进行判断(高阈值和低阈值)
1),若像素超过高阈值,则像素保留我边缘像素
2)、若像素低于低阈值,则像素排除
3)、若像素的位置位于两者之间,该像素仅仅在连接到一个高于高阈值的像素时被保留。
python-opencv
cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]]) -> edges
参数说明:
image:单通道图像
threshold 1/2:阈值
L2gradient,计算图像梯度的幅值。
cv2.Canny(img,100,150)
Sobel算子:
Canny算子是Sobel算子的升级版。用来计算灰度图像的近似梯度。
计算方法:
分别在X和Y两个方向求导。
Sobel函数
help(cv2.Sobel)
Help on built-in function Sobel:
Sobel(...)
Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]]) -> dst
参数说明:
src:输入的灰度图像
ddepth:输出图像的深度,输出原图深度可取 -1
dx:X方向的差分阶数
dy:Y方向的差分阶数
ksize:核大小,默认为3
scale:缩放因子
将X方向和Y方向的合起来:
addWeighted(...)
addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) -> dst
参数说明:
alpha,beta 权重参数
gamma:是加到最后结果上的值
import cv2
img=cv2.imread("G:\python_cv2\dataset\Fanbb.jpg",0)
#canny_edg=cv2.Canny(img,50,150)
sobel_edgX=cv2.Sobel(img,cv2.CV_8U,1,0)
sobel_edgY=cv2.Sobel(img,cv2.CV_8U,0,1)
dst_sobel=cv2.addWeighted(sobel_edgX,0.5,sobel_edgY,0.5,0)
cv2.imshow("sobel",dst_sobel)
cv2.imshow("sobel_edgX",sobel_edgX)
cv2.imshow("sobel_edgY",sobel_edgY)
cv2.imshow("orignal",img)
cv2.imshow("Canny",canny_edg)
cv2.waitKey()
cv2.destroyAllWindows()
上一篇: 边缘检测
下一篇: wpf listview images