openCV的基本操作(二)——邊緣檢測

邊緣檢測

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算法
在這裏插入圖片描述

三種算子的對比

在這裏插入圖片描述

發佈了5 篇原創文章 · 獲贊 0 · 訪問量 1662
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章