Python圖像處理之邊緣檢測原理詳解
原理
邊緣檢測是圖像處理和計(jì)算機(jī)視覺當(dāng)中的基本問題,邊緣檢測的目的是標(biāo)識(shí)數(shù)字圖像中亮度變化明顯的點(diǎn),圖像的邊緣檢測可以大幅度的減少數(shù)據(jù)量,并且剔除了可以認(rèn)為不相關(guān)的信息,保留了圖像重要的結(jié)構(gòu)屬性,它們絕大多數(shù)可以分為兩類:基于搜索和基于零穿越。
基于搜索:通過尋找圖像一階導(dǎo)數(shù)中max來檢測邊界,然后利用計(jì)算結(jié)果估計(jì)邊緣的局部方向,通常采用梯度的方向,并在此方向找到局部梯度模的最大值,代表的算法是Sobel算子和Scharr算子。

基于零穿越:通過尋找圖像二階導(dǎo)數(shù)零穿越來尋找邊界,代表算法是Laplacian算子。

Sobel檢測算子
Sobel邊緣檢測算法比較簡單,實(shí)際應(yīng)用中效率要比Canny邊緣檢測算法效率要高,但邊緣檢測效果不如Canny準(zhǔn)確,但很多常會(huì)它依舊是首選,它是高斯平滑與微分操作的結(jié)合體,所以其抗燥聲能力很強(qiáng),用途較多,尤其是對(duì)效率要求較高,而對(duì)細(xì)紋理不是很在意的情況下。
方法

那么我們看到上圖最后一個(gè)式子,在某一個(gè)領(lǐng)域內(nèi),某一方向上,前一個(gè)像素與后一個(gè)像素的差,除以(x+1)-(x-1)=2,就得到當(dāng)前的一個(gè)一階導(dǎo)數(shù),這就是Sobel算子的一個(gè)思想。
這里假設(shè)要處理的對(duì)象為I,在兩個(gè)方向求導(dǎo):
- 水平變化:將圖像I與奇數(shù)大小的模板進(jìn)行卷積,結(jié)果為Gx。
- 垂直變化:將圖像I與奇數(shù)大小的模板進(jìn)行卷積,結(jié)果為Gy。
如下,模板為3;

最后,統(tǒng)計(jì)極大值所在的位置,即為圖像的邊緣
注:當(dāng)內(nèi)核大小為3時(shí),以上Sobel內(nèi)核可能會(huì)產(chǎn)生比較明顯的誤差,為解決這一個(gè)問題,我們使用Scharr函數(shù),但該函數(shù)僅作用于大小為3的內(nèi)核,該函數(shù)的運(yùn)行速度與Sobel算子一樣快,但結(jié)果更加精準(zhǔn),其計(jì)算方法為下圖所示:

應(yīng)用
Opencv當(dāng)中的API為:
sobel_x_or_y=Sobel(src, ddepth, dx, dy, dst=None, ksize=None, scale=None, delta=None, borderType=None) """ src:傳入圖像 ddepth:圖像的深度 dx、dy=指求導(dǎo)的階數(shù),0表示這個(gè)方向上沒有求導(dǎo),取值為0、1 ksize=是Sobel算子的大小,即卷積核的大小,為奇數(shù)(1,3,5,7等),默認(rèn)是3 scale:縮放導(dǎo)數(shù)的比例常數(shù),默認(rèn)沒有 borderType:函數(shù)的邊界模式,默認(rèn)是cv2.BORDER_DEFAULT """
Sobel函數(shù)求導(dǎo)后會(huì)有負(fù)數(shù),還有大于255的值,原圖像為uint8,8位無符號(hào)數(shù),所以Sobel建立的圖像位數(shù)不夠,會(huì)有截?cái)唷R虼?,要?6位有符號(hào)的數(shù)據(jù)類型,即cv2.CV_16S(放到深度中)。處理完圖像后,再使用cv2.convertScaleAbs()函數(shù)將其再轉(zhuǎn)為uint8格式,否則無法顯示圖像。
Sobel算子是兩個(gè)方向計(jì)算的,最后要用cv2.addWeighted()函數(shù)將其組合起來
Scale_abs=cv2.convertScaleAbs(x) result=cv2.addWeighted(scr1,alpha,scr2,beta) #混合x,y方向
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread("Images/1-1.jpg",0)
#Sobel:x,y方向
x=cv2.Sobel(img,cv2.CV_16S,1,0)
y=cv2.Sobel(img,cv2.CV_16S,0,1)
#數(shù)據(jù)轉(zhuǎn)化
Scale_absx=cv2.convertScaleAbs(x)
Scale_absy=cv2.convertScaleAbs(y)
#混合圖像
result=cv2.addWeighted(Scale_absx,0.5,Scale_absy,0.5,0)
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img,cmap=plt.cm.gray),plt.title('yuantu')
plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(result,cmap=plt.cm.gray),plt.title('Sobel')
plt.xticks([]),plt.yticks([])
plt.show()而Scharr,就是將Sobel算子當(dāng)中的變成ksize=-1。
x=cv2.Sobel(img,cv2.CV_16S,1,0,ksize=-1) y=cv2.Sobel(img,cv2.CV_16S,0,1,ksize=-1)
可以看到,Scharr檢測的細(xì)節(jié)更加多一些。
Laplacian算子
laplacian是利用二階導(dǎo)數(shù)來檢測邊緣。因?yàn)閳D像是“二維”,需要在兩個(gè)方向上求導(dǎo),如下所示

API:
laplacian=cv2.Laplacian(src, ddepth, dst=None, ksize=None, scale=None, delta=None, borderType=None) """ src:圖像 Ddepth:圖像的深度,-1表示采用的是原圖像相同的深度,目標(biāo)圖像的深度必須要大于等于原圖像的深度; ksize:卷積核的大小,必須為奇數(shù) """
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread("Images/1-1.jpg",0)
result=cv2.Laplacian(img,cv2.CV_16S)
Scale_abs=cv2.convertScaleAbs(result)
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img,cmap=plt.cm.gray),plt.title('yuantu')
plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(result,cmap=plt.cm.gray),plt.title('laplacian')
plt.xticks([]),plt.yticks([])
plt.show()
算子比較

到此這篇關(guān)于Python圖像處理之邊緣檢測原理詳解的文章就介紹到這了,更多相關(guān)Python邊緣檢測內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django User 模塊之 AbstractUser 擴(kuò)展詳解
這篇文章主要介紹了Django User 模塊之 AbstractUser 擴(kuò)展詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03
Python實(shí)現(xiàn)指定區(qū)域桌面變化監(jiān)控并報(bào)警
在這篇博客中,我們將使用Python編程語言和一些常用的庫來實(shí)現(xiàn)一個(gè)簡單的區(qū)域監(jiān)控和變化報(bào)警系統(tǒng),文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2023-07-07
Python如何處理異常報(bào)錯(cuò)方法(建議收藏!)
開發(fā)程序其實(shí)就像預(yù)測天氣一樣,即使是代碼的異常錯(cuò)誤,也應(yīng)該能預(yù)測且被控制,下面這篇文章主要給大家介紹了關(guān)于Python如何處理異常報(bào)錯(cuò)方法的相關(guān)資料,需要的朋友可以參考下2022-06-06
Python Django實(shí)現(xiàn)layui風(fēng)格+django分頁功能的例子
今天小編就為大家分享一篇Python Django實(shí)現(xiàn)layui風(fēng)格+django分頁功能的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08
在Python的Django框架中更新數(shù)據(jù)庫數(shù)據(jù)的方法
這篇文章主要介紹了在Python的Django框架中更新數(shù)據(jù)庫數(shù)據(jù),對(duì)此Django框架中提供了便利的插入和更新方法,需要的朋友可以參考下2015-07-07
OpenCV利用python來實(shí)現(xiàn)圖像的直方圖均衡化
這篇文章主要介紹了OpenCV利用python來實(shí)現(xiàn)圖像的直方圖均衡化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10

