邊緣檢測
Sobel算子
# Sobel算子x,y
kernel_Sobel_x = np.array((
[1, 0, -1],
[2, 0, -2],
[1, 0, -1]), dtype="float32")
kernel_Sobel_y = np.array((
[-1, -2, -1],
[0, 0, 0],
[1, 2, 1]), dtype="float32")
# 單方向有兩種實現方式
imsx = cv2.filter2D(im, -1, kernel_Sobel_x)
imsy = cv2.filter2D(im, -1, kernel_Sobel_y)
ims_x = cv2.Sobel(im, -1, 1, 0)
ims_y = cv2.Sobel(im, -1, 0, 1)
# 兩個方向
ims = cv2.Sobel(im, cv2.CV_16S, 1, 1)
左起爲原圖,x方向1,x方向2,y方向1,y方向2,和兩個方向。
很明顯單方向實現的兩個形式是等價的。
拉普拉斯算子
# 拉普拉斯算子
kernel_laplace8 = np.array((
[1, 1, 1],
[1, -8, 1],
[1, 1, 1]), dtype="float32")
kernel_laplace4 = np.array((
[0, 1, 0],
[1, -4, 1],
[0, 1, 0]), dtype="float32")
# 自定義的算子
iml4 = cv2.filter2D(im, -1, kernel_laplace4)
iml8 = cv2.filter2D(im, -1, kernel_laplace8)
# 另外一個實現形式
iml = cv2.Laplacian(im, -1)
左起爲原圖,4鄰域拉普拉斯算子,8鄰域拉普拉斯算子和cv2自帶的拉普拉斯算法。
可以看出cv2自帶的是4鄰域拉普拉斯算子。
canny算子
# im 原圖像
# threshold1 最低值
# threshold2 最高值
imc = cv2.Canny(im, 100, 230)
左:原圖,右:canny算法