Python圖像處理之邊緣檢測(cè)原理詳解
原理
邊緣檢測(cè)是圖像處理和計(jì)算機(jī)視覺(jué)當(dāng)中的基本問(wèn)題,邊緣檢測(cè)的目的是標(biāo)識(shí)數(shù)字圖像中亮度變化明顯的點(diǎn),圖像的邊緣檢測(cè)可以大幅度的減少數(shù)據(jù)量,并且剔除了可以認(rèn)為不相關(guān)的信息,保留了圖像重要的結(jié)構(gòu)屬性,它們絕大多數(shù)可以分為兩類(lèi):基于搜索和基于零穿越。
基于搜索:通過(guò)尋找圖像一階導(dǎo)數(shù)中max來(lái)檢測(cè)邊界,然后利用計(jì)算結(jié)果估計(jì)邊緣的局部方向,通常采用梯度的方向,并在此方向找到局部梯度模的最大值,代表的算法是Sobel算子和Scharr算子。
基于零穿越:通過(guò)尋找圖像二階導(dǎo)數(shù)零穿越來(lái)尋找邊界,代表算法是Laplacian算子。
Sobel檢測(cè)算子
Sobel邊緣檢測(cè)算法比較簡(jiǎn)單,實(shí)際應(yīng)用中效率要比Canny邊緣檢測(cè)算法效率要高,但邊緣檢測(cè)效果不如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è)問(wèn)題,我們使用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è)方向上沒(méi)有求導(dǎo),取值為0、1 ksize=是Sobel算子的大小,即卷積核的大小,為奇數(shù)(1,3,5,7等),默認(rèn)是3 scale:縮放導(dǎo)數(shù)的比例常數(shù),默認(rèn)沒(méi)有 borderType:函數(shù)的邊界模式,默認(rèn)是cv2.BORDER_DEFAULT """
Sobel函數(shù)求導(dǎo)后會(huì)有負(fù)數(shù),還有大于255的值,原圖像為uint8,8位無(wú)符號(hào)數(shù),所以Sobel建立的圖像位數(shù)不夠,會(huì)有截?cái)?。因此,要?6位有符號(hào)的數(shù)據(jù)類(lèi)型,即cv2.CV_16S(放到深度中)。處理完圖像后,再使用cv2.convertScaleAbs()函數(shù)將其再轉(zhuǎn)為uint8格式,否則無(wú)法顯示圖像。
Sobel算子是兩個(gè)方向計(jì)算的,最后要用cv2.addWeighted()函數(shù)將其組合起來(lái)
Scale_abs=cv2.convertScaleAbs(x) result=cv2.addWeighted(scr1,alpha,scr2,beta) #混合x(chóng),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檢測(cè)的細(xì)節(jié)更加多一些。
Laplacian算子
laplacian是利用二階導(dǎo)數(shù)來(lái)檢測(cè)邊緣。因?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圖像處理之邊緣檢測(cè)原理詳解的文章就介紹到這了,更多相關(guān)Python邊緣檢測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用MySQL8.2讀寫(xiě)分離實(shí)現(xiàn)示例詳解
在這篇文章中,我們將了解如何將?MySQL?8.2?的讀寫(xiě)分離功能與?MySQL-Connector/Python?一起使用的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11python中把嵌套的列表合并成一個(gè)列表方法總結(jié)
python中l(wèi)ist這種數(shù)據(jù)結(jié)構(gòu)很常用到,下面這篇文章主要給大家介紹了關(guān)于python中把嵌套的列表合并成一個(gè)列表方法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11詳解PyTorch手寫(xiě)數(shù)字識(shí)別(MNIST數(shù)據(jù)集)
這篇文章主要介紹了詳解PyTorch手寫(xiě)數(shù)字識(shí)別(MNIST數(shù)據(jù)集),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Python設(shè)計(jì)模式之MVC模式簡(jiǎn)單示例
這篇文章主要介紹了Python設(shè)計(jì)模式之MVC模式,簡(jiǎn)單介紹了MVC模式的概念、原理,并結(jié)合實(shí)例形式給出了Python實(shí)現(xiàn)與使用MVC模式的相關(guān)操作技巧,需要的朋友可以參考下2018-01-01Django 自定義404 500等錯(cuò)誤頁(yè)面的實(shí)現(xiàn)
這篇文章主要介紹了Django 自定義404 500等錯(cuò)誤頁(yè)面的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03