opencv+python 邊緣檢測的基本原理,及Sobel、LoG和Canny算子的程序實現

圖像邊緣檢測的原理:
圖象的邊緣是指圖象局部區域亮度變化顯著的部分,該區域的灰度剖面一般可以看作是一個階躍,既從一個灰度值在很小的緩衝區域內急劇變化到另一個灰度相差較大的灰度值。圖象的邊緣部分集中了圖象的大部分信息,圖象邊緣的確定與提取對於整個圖象場景的識別與理解是非常重要的,同時也是圖象分割所依賴的重要特徵,邊緣檢測主要是圖象的灰度變化的度量、檢測和定位。

輸入圖片說明

邊緣檢測的基本原理: 邊緣檢測的本質是微分,如上圖所示,當相鄰兩個像素點的灰度值差異越大時,也就是其斜率越陡,也就是微分值越大,進而通過這個來判斷邊緣,實際中常用差分,x方向和y方向。

Sobel算子

輸入圖片說明

原理:算子使用兩個3X3的矩陣(圖1)算子使用兩個3X3的矩陣(圖1)去和原始圖片作卷積,分別得到橫向G(x)和縱向G(y)的梯度值,如果梯度值大於某一個閾值,則認爲該點爲邊緣點。

LoG算子

輸入圖片說明

原理:首先對圖像做高斯濾波,然後再求其拉普拉斯(Laplacian)二階導數。即圖像與 Laplacian of the Gaussian function 進行濾波運算。最後,通過檢測濾波結果的零交叉(Zero crossings)可以獲得圖像或物體的邊緣。因而,也被業界簡稱爲Laplacian-of-Gaussian (LoG)算子。

Canny算子

算法步驟:

第一步:對原始圖像進行灰度化、對圖像進行高斯濾波

Canny算法通常處理的圖像爲灰度圖,因此如果攝像機獲取的是彩色圖像,那首先就得進行灰度化。對一幅彩色圖進行灰度化,就是根據圖像各個通道的採樣值進行加權平均。圖像高斯濾波的實現可以用兩個一維高斯核分別兩次加權實現,也可以通過一個二維高斯核一次卷積實現。

第二步:用一階偏導的有限差分來計算梯度的幅值方向

關於圖像灰度值得梯度可使用一階有限差分來進行近似,這樣就可以得圖像在x和y方向上偏導數的兩個矩陣。

第三步:對梯度幅值進行非極大值抑制

圖像梯度幅值矩陣中的元素值越大,說明圖像中該點的梯度值越大,但這不不能說明該點就是邊緣(這僅僅是屬於圖像增強的過程)。

第四步:用雙閾值算法檢測和連接邊緣

Canny算法中減少假邊緣數量的方法是採用雙閾值法。選擇兩個閾值(關於閾值的選取方法在擴展中進行討論),根據高閾值得到一個邊緣圖像,這樣一個圖像含有很少的假邊緣,但是由於閾值較高,產生的圖像邊緣可能不閉合,爲解決這樣一個問題採用了另外一個低閾值。在高閾值圖像中把邊緣鏈接成輪廓,當到達輪廓的端點時,該算法會在斷點的8鄰域點中尋找滿足低閾值的點,再根據此點收集新的邊緣,直到整個圖像邊緣閉合。

三種邊緣檢測的程序實現:

# -*- coding:utf-8 -*-
#本程序用於邊緣檢測
import cv2  #導入opencv模塊
import numpy as np

print("Hellow word!")     #打印“Hello word!”,驗證模塊導入成功

img = cv2.imread("lena.jpg")  #導入圖片,圖片放在程序所在目錄
cv2.namedWindow("imagshow", 2)   #創建一個窗口
cv2.imshow('imagshow', img)    #顯示原始圖片

#高斯模糊
blurred = cv2.GaussianBlur(img, (3, 3), 0)
#轉換爲灰度圖
out_img_GRAY=cv2.cvtColor(blurred,cv2.COLOR_BGR2GRAY)#將圖片轉換爲灰度圖
cv2.namedWindow("img_GRAY", 2)   #創建一個窗口
cv2.imshow('img_GRAY', out_img_GRAY)    #顯示原始圖片


#使用Canny算子進行邊緣檢測
edge_output = cv2.Canny(out_img_GRAY, 10, 300)
cv2.namedWindow("Canny", 2)   #創建一個窗口
cv2.imshow('Canny', edge_output)    #顯示原始圖片


#使用sobel算子進行邊緣檢測
sobel = cv2.Sobel(out_img_GRAY,-1,1,0,ksize=3)
cv2.namedWindow("sobel", 2)   #創建一個窗口
cv2.imshow('sobel', sobel)    #顯示原始圖片


#使用laplacian算子進行邊緣檢測
laplacian = cv2.Laplacian(out_img_GRAY,-1)
cv2.namedWindow("laplacian", 2)   #創建一個窗口
cv2.imshow('laplacian', laplacian)    #顯示原始圖片

cv2.waitKey()

實現效果如圖:

輸入圖片說明

從左到右分別爲:灰度圖、Canny算子、soble算子、laplacian算子

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