- 图像的边缘指的是灰度值发生急剧变化的位置
- 边缘,在某种程度上它不随光照和视角的变化而变化
- 边缘检测的目的是制作一个线图,在不会损害理解图像内容的情况下,同时又大大减少图像的数据量。提供对图像数据的合适概述
边缘检测大多是通过基于方向导数掩码(梯度方向导数)求卷积的方法。
Sobel算子
Sobel算子是在一个坐标轴方向上进行非归一化的高斯平滑,在另一个坐标轴方向上进行差分处理。
API
import cv2
def sobel_demo(image):
grad_x=cv2.Sobel(image,cv2.CV_32F,1,0)
grad_y=cv2.Sobel(image,cv2.CV_32F,0,1)
cv2.imshow("grad_x",grad_x)
cv2.imshow("grad_y",grad_y)
gradxy =cv2.addWeighted(grad_x,0.5,grad_y,0.5,0)
cv2.imshow("grad",gradxy)
src = cv2.imread(r'C:\Users\h\Desktop\image\lena.jpg',cv2.IMREAD_GRAYSCALE)
cv2.imshow("src",src)
sobel_demo(src)
cv2.waitKey(0)
cv2.destroyAllWindows()
Scharr算子
import cv2
def scharr_demo(image):
grad_x=cv2.Scharr(image,cv2.CV_32F,1,0)
grad_y=cv2.Scharr(image,cv2.CV_32F,0,1)
# cv2.imshow("grad_x",grad_x)
# cv2.imshow("grad_y",grad_y)
gradxy =cv2.addWeighted(grad_x,0.5,grad_y,0.5,0)
cv2.imshow("grad",gradxy)
src = cv2.imread(r'C:\Users\h\Desktop\image\lena.jpg',cv2.IMREAD_ANYCOLOR)
cv2.imshow("src",src)
scharr_demo(src)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果可能比Soble算子更强烈一些
Laplacian算子
利用二维函数的拉普拉斯变换
import cv2
import numpy as np
def laplacian_demo(image):
# dst = cv2.Laplacian(image,cv2.CV_32F)
# lpls = cv2.convertScaleAbs(dst)
# cv2.imshow("lpls",lpls)
kernel = np.array([[0,-1,0],[-1,4,-1],[0,-1,0]],np.float32)
dst = cv2.filter2D(image,cv2.CV_32F,kernel=kernel)
lpls=lpls = cv2.convertScaleAbs(dst)
cv2.imshow("lpls",lpls)
src = cv2.imread(r'C:\Users\h\Desktop\image\lena.jpg',cv2.IMREAD_GRAYSCALE)
cv2.imshow("src",src)
laplacian_demo(src)
cv2.waitKey(0)
cv2.destroyAllWindows()
Canny算子
Canny边缘检测提出了:
- 基于边缘梯度方向的非极大值抑制
- 双阈值的滞后阈值处理
import cv2 as cv
import numpy as np
def edge_demo(image):
blurred = cv.GaussianBlur(image,(3,3),0)
gray = cv.cvtColor(blurred,cv.COLOR_BGR2GRAY)
# xgrad=cv.Sobel(gray,cv.CV_16SC1,1,0)
# ygrad=cv.Sobel(gray,cv.CV_16SC1,0,1)
# edge_output = cv.Canny(xgrad,ygrad,50,150)
edge_output = cv.Canny(gray,50,150)
cv.imshow("Canny_edge",edge_output)
dst=cv.bitwise_and(image,image,mask=edge_output)
cv.imshow("Color_edge",dst)
#
src = cv.imread(r'C:\Users\h\Desktop\image\lena.jpg')
cv.imshow("src",src)
edge_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()