opencv-python 學習 | canny邊緣檢測

Canny邊緣檢測

Canny 的目標是找到一個最優的邊緣檢測算法,最優邊緣檢測的含義是:

1.最優檢測:算法能夠儘可能多地標識出圖像中的實際邊緣,漏檢真實邊緣的概率和誤檢非邊緣的概率都儘可能小;

2.最優定位準則:檢測到的邊緣點的位置距離實際邊緣點的位置最近,或者是由於噪聲影響引起檢測出的邊緣偏離物體的真實邊緣的程度最小;

3.檢測點與邊緣點一一對應:算子檢測的邊緣點與實際邊緣點應該是一一對應。

Canny邊緣檢測主要分成以下幾個步驟:
1.使用高斯濾波器,以平滑圖像,濾除噪聲。
2.計算圖像中每個像素點的梯度強度和方向。
3.應用非極大值(Non-Maximum Suppression)抑制,以消除邊緣檢測帶來的雜散響應。
4.應用雙閾值(Double-Threshold)檢測來確定真實的和潛在的邊緣。
5.通過抑制孤立的弱邊緣最終完成邊緣檢測。

import cv2
import numpy as np
#顯示圖像函數
def cv_show(name,img):
    cv2.imshow(name,img)
    while cv2.waitKey(100) != 27:# loop if not get ESC
        if cv2.getWindowProperty(name,cv2.WND_PROP_VISIBLE) <= 0:
            break
    cv2.destroyWindow(name)

Canny函數:
def Canny(image,threshold1,threshold2,edges=None,apertureSize=None,L2gradient=None)

threshold1:int類型的,低閾值
threshold2:int類型的,高閾值
edeges:單通道存儲邊緣的輸出圖像
apertureSize:Sobel算子內核(kSize)大小
L2gradiend:Bool類型的,爲真表示使用更精確的L2範數進行計算(兩個方向的倒數的平方再開放),爲假表示用L1範數(直接將兩個方向導數的絕對值相加)


img = cv2.imread('lena.jpg',cv2.IMREAD_GRAYSCALE)
v1 = cv2.Canny(img,80,150)
v2 = cv2.Canny(img,50,100)
res = np.hstack((v1,v2))
cv_show('res',res)

當我們改變閾值後,圖像後漸漸過濾掉一些背景,當然,重在閾值的選取上,當閾值選大的時候,也是會將圖像的特徵完全損壞的


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章