边缘检测
边缘检测是图像领域非常重要的一种处理手段,要理解边缘检测,首先要理解什么是边缘。边缘是图像局部强度具有非常强烈变化的区域。
边缘检测算子可以分为一阶边缘检测算子、二阶边缘检测算子和其他检测算子。比较常用的有三种,sobel、canny、laplacian
一阶边缘检测算子
边缘的像素强度会发生剧烈的变化,这种变化可以由梯度的变化形象地看到。
image.png
可以从上图看到,通过一阶求导得到梯度曲线图后,发现在梯度最大值处会发生一次边缘“跳跃”,这就是我们要找到的边缘位置。
sobel
sobel的处理过程:
1.图像和模板进行卷积操作,得到边缘检测图像
2.假设图像为I,分别从水平和垂直方向对图像I进行卷积操作,水平模板设为Gx,垂直模板设为Gy,则:
image.png
image.png
3.最终的梯度值为:
image.png
举个例子:
import cv2
img = cv2.imread("edge.jpg", 0)
cv2.namedWindow("src img")
cv2.namedWindow("Result")
x = cv2.Sobel(img,cv2.CV_16S,1,0)
y = cv2.Sobel(img,cv2.CV_16S,0,1)
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
dst = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
cv2.imshow("src img",img)
cv2.imshow("Result", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
image.png
Canny
Canny边缘检测算法的整体流程:
1)使用高斯滤波器,平滑图像,滤除噪声;
2)计算图像中每个像素位置的梯度和方向;
3)应用非极大值抑制,消除边缘检测带来的杂散响应;
4)应用双阈值检测来确定真实的和潜在的边缘;
5)通过抑制孤立的弱边缘来完成最后的边缘检测。
import cv2
img = cv2.imread("edge.jpg",0)
gauss_img = cv2.GaussianBlur(img,(3,3),0)
dst = cv2.Canny(gauss_img,50,150)
cv2.namedWindow("src img")
cv2.namedWindow("edge img")
cv2.imshow("src img",img)
cv2.imshow("edge img",dst)
cv2.waitKey(0)
image.png
二阶边缘检测算子
Laplacian
在一阶边缘检测介绍时,我们用图像形象地表示了求导后的函数曲线,如果继续对梯度函数再次求导,就可以得到二阶函数曲线:
image.png
由此,可以看到二阶函数的边缘处值为0,这是一个非常好区别边缘的特点。拉普拉斯表达式如下:
img = cv2.imread("edge.jpg",0)
dst_img = cv2.Laplacian(img,cv2.CV_16S,3)
dst_img = cv2.convertScaleAbs(dst_img)
cv2.namedWindow("src img")
cv2.namedWindow("laplacian img")
cv2.imshow("src img",img)
cv2.imshow("laplacian img",dst_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
image.png
网友评论