1.邊緣檢測(cè)算子分類
(1)一階導(dǎo)數(shù)的邊緣檢測(cè)算子:
通過(guò)模板作為核與圖像的每個(gè)像素點(diǎn)做卷積和運(yùn)算,然后選取合適的閾值來(lái)提取圖像的邊緣。常見(jiàn)的有Roberts算子、Sobel算子和Prewitt算子。
(2)二階導(dǎo)數(shù)的邊緣算子:
依據(jù)于二階導(dǎo)數(shù)過(guò)零點(diǎn),常見(jiàn)的有Laplacian 算子,此類算子對(duì)噪聲敏感。
(3)Canny算子:
前面兩類均是通過(guò)微分算子來(lái)檢測(cè)圖像邊緣,還有一種就是Canny算子,其是在滿足一定約束條件下推導(dǎo)出來(lái)的邊緣檢測(cè)最優(yōu)化算子。
2.Canny算子核心理論
2.1.Canny算子簡(jiǎn)單介紹
Canny算子是一種非常常用的邊緣檢測(cè)算子,其效果圖如下所示:
2.2.Canny算子邊緣檢測(cè)指標(biāo)
Canny算子是基于邊緣檢測(cè)來(lái)實(shí)現(xiàn)的,那么邊緣檢測(cè)的指標(biāo)如下所示:
(1)好的信噪比,即將非邊緣點(diǎn)判定為邊緣點(diǎn)的概率要低。
(2)高定位,檢測(cè)出的邊緣要在實(shí)際邊緣中心。
(3)對(duì)單一邊緣僅有唯一響應(yīng),即虛假邊緣要能得到最大抑制。
2.3.Canny算子基本原理
1.2個(gè)條件:一能有效抑制噪聲,二能精確定位邊緣位置
2.平滑后求導(dǎo),用高斯濾波器進(jìn)行平滑
3.用一階偏導(dǎo)有限差分計(jì)算梯度幅值與方向
3.對(duì)梯度幅值進(jìn)行非極大值抑制
4.用雙闖值檢測(cè)與連接邊緣
3.Canny算子處理流程
第三部分的內(nèi)容引用自:https://blog.csdn.net/zaishuiyifangxym/article/details/90142702
我的工作就是通過(guò)其的blog來(lái)進(jìn)行學(xué)習(xí),這位博主的cv的專欄寫的非常好。
如果大家這這篇blog中有什么不明白的可以去他的專欄里面看看,內(nèi)容非常全面,應(yīng)該能夠有比較好的解答。
3.1.高斯濾波去噪聲化
根據(jù)上述算法的第一個(gè)原理,我們需要對(duì)于圖片影響進(jìn)行去噪聲化處理。
邊緣檢測(cè)容易受到噪聲的影像。因此,在進(jìn)行邊緣檢測(cè)前,通常需要進(jìn)行去噪。通常,使用高斯濾波來(lái)去除噪聲,高斯濾波去噪是比較常用的去噪函數(shù)合,其5x5的模板公式對(duì)應(yīng)如下:
1
273
×
[
1
4
7
4
1
4
16
26
16
4
7
26
41
26
7
4
16
26
16
4
1
4
7
4
1
]
\frac{1}{273}\times\begin{bmatrix}1&4&7&4&1\\4&16&26&16&4\\7&26&41&26&7\\4&16&26&16&4\\1&4&7&4&1\end{bmatrix}
2731?×
?14741?41626164?72641267?41626164?14741?
?
在Opencv庫(kù)當(dāng)中,高斯濾波的函數(shù)如下所示:
img = cv2.GaussianBlur(src, ksize, sigmaX)
其中,參數(shù):src 表示原始圖像;ksize 表示核大小,而且ksize只能是奇數(shù);sigmaX 表示X方向方差。
3.2.圖像梯度搜尋
在這一部分的內(nèi)容當(dāng)中,我們需要去計(jì)算和找尋梯度幅值和方向,尋找圖像的梯度。我們需要先將卷積模板分別作用x和y方向,再計(jì)算梯度幅值和方向,其公式如下所示:
卷積化
:
d
x
=
[
?
1
0
1
?
2
0
2
?
1
0
1
]
d
y
=
[
?
1
?
2
?
1
0
0
0
1
2
1
]
幅度
:
S
=
d
x
2
+
d
y
2
方向
:
θ
=
arctan
?
(
d
y
d
x
)
\begin{aligned}卷積化:d_x&=\begin{bmatrix}-1&0&1\\-2&0&2\\-1&0&1\end{bmatrix}\quad d_y=\begin{bmatrix}-1&-2&-1\\0&0&0\\1&2&1\end{bmatrix}\\\\幅度:S&=\sqrt{d_x^2+d_y^2}\\\\ 方向:\theta&=\arctan(\frac{d_y}{d_x})\end{aligned}
卷積化:dx?幅度:S方向:θ?=
??1?2?1?000?121?
?dy?=
??101??202??101?
?=dx2?+dy2??=arctan(dx?dy??)?
計(jì)算之后得到的幅度和方向如圖所示:
????????? ????
3.3.非極大值抑制處理
? 對(duì)于每個(gè)像素點(diǎn),它進(jìn)行如下操作:應(yīng)用非最大抑制技術(shù)來(lái)過(guò)濾掉非邊緣像素,將模糊的邊界變得清晰。該過(guò)程保留了每個(gè)像素點(diǎn)上梯度強(qiáng)度的極大值,過(guò)濾掉其他的值。
Step1:將其梯度方向近似為以下值中的一個(gè),包括0、45、90、135、180、225、270和315,即表示上下左右和45度方向。
Step2:比較該像素點(diǎn)和其梯度正負(fù)方向的像素點(diǎn)的梯度強(qiáng)度,如果該像素點(diǎn)梯度強(qiáng)度最大則保留,否則抑制(刪除,即置為0)。
Step1和Step2的處理方式如圖所示:
3.4.雙閾值邊界處理
? 雙閾值邊界處理的原理也比較簡(jiǎn)單,我們對(duì)非極大值抑制圖像作用兩個(gè)閾值
T
l
o
w
T_{low}
Tlow?和
T
h
i
g
h
T_{high}
Thigh?。 把梯度值小于
T
l
o
w
T_{low}
Tlow?的像素的灰度值設(shè)為0,得到圖像1。然后把梯度值大于
T
h
i
g
h
T_{high}
Thigh?的像素的灰度值設(shè)為0,得到圖像2。
?由于圖像2的閾值值較高,去除大部分噪音,但同時(shí)也損失了有用的邊緣信息。而圖像1的閾值較低,保留了較多的信息,我們可以以圖像2為基礎(chǔ),以圖像1為補(bǔ)充來(lái)連結(jié)圖像的邊緣。
? ? ?
3.5.邊界滯后技術(shù)跟蹤
邊界滯后技術(shù)跟蹤的方法研究來(lái)自:https://blog.csdn.net/qq_44736333/article/details/109152380
?我們假設(shè)兩類邊緣:經(jīng)過(guò)非極大值抑制之后的邊緣點(diǎn)中,梯度值超過(guò)T1的稱為強(qiáng)邊緣,梯度值小于T1大于T2的稱為弱邊緣,梯度小于T2的不是邊緣。
?可以肯定的是,強(qiáng)邊緣必然是邊緣點(diǎn),因此必須將T1設(shè)置的足夠高,以要求像素點(diǎn)的梯度值足夠大(變化足夠劇烈),而弱邊緣可能是邊緣,也可能是噪聲,如何判斷呢?
?當(dāng)弱邊緣的周圍8鄰域有強(qiáng)邊緣點(diǎn)存在時(shí),就將該弱邊緣點(diǎn)變成強(qiáng)邊緣點(diǎn),以此來(lái)實(shí)現(xiàn)對(duì)強(qiáng)邊緣的補(bǔ)充。
?實(shí)際中人們發(fā)現(xiàn)T1:T2=2:1的比例效果比較好,其中T1可以人為指定,也可以設(shè)計(jì)算法來(lái)自適應(yīng)的指定,比如定義梯度直方圖的前30%的分界線為T1,我實(shí)現(xiàn)的是人為指定閾值。
?在上圖中,白色方塊代表存在邊緣(包括強(qiáng)弱邊緣),遍歷弱邊緣中的每個(gè)像素,如果像素的八鄰域存在強(qiáng)邊緣對(duì)應(yīng)的像素,則將這個(gè)弱邊緣像素歸為真正的邊緣(從視覺(jué)上來(lái)理解,就是存在一條不確定的邊緣,如果這條不確定的邊緣旁存在真正的邊緣,則將這條邊歸為真邊,非則就將其刪除)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-728122.html
3.6.Canny算子邊緣檢測(cè)的特點(diǎn)
1.檢出準(zhǔn)則: 該準(zhǔn)則要求不應(yīng)丟失重要的邊緣,而且不應(yīng)輸出噪聲性的多余邊緣。
2.定位準(zhǔn)則: 該準(zhǔn)則要求檢測(cè)到的邊緣位置與實(shí)際邊緣位置之間的距離為最小。
3.單一響應(yīng)準(zhǔn)則: 該準(zhǔn)則在一定程度上多涵蓋為檢出準(zhǔn)則,它要求盡可能減少對(duì)于同一邊緣出現(xiàn)多個(gè)響應(yīng)的情況。
4.Canny算子算法代碼
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來(lái)正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus'] = False # 用來(lái)正常顯示負(fù)號(hào)
def All_Canny(img):
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#圖像灰度化處理
gaussian = cv2.GaussianBlur(grayImage, (5, 5), 0)# 高斯濾波降噪
Canny = cv2.Canny(gaussian, 50, 150)# Canny算子
return grayImage, gaussian,Canny
# 讀取圖像
img = cv2.imread('lena.jpg')#imread出來(lái)的是BRG圖像
lenna_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)#轉(zhuǎn)化為RGB圖像
# 顯示圖形
Figure=All_Canny(img)#獲取Canny檢測(cè)之后的圖片
#圖像可視化處理
titles = [u'原始圖像', u'灰度處理圖',u'高斯去噪處理圖', u'Canny算子c處理圖']
images = [lenna_img ,Figure[0],Figure[1], Figure[2]]
#subplot繪制
#第一張圖
plt.subplot(2, 2, 1)
plt.imshow(images[0], 'gray'),plt.title(titles[0])
plt.xticks([]),plt.yticks([])
#第二張圖
plt.subplot(2, 2, 2)
plt.imshow(images[1], 'gray'),plt.title(titles[1])
plt.xticks([]),plt.yticks([])
#第三張圖
plt.subplot(2, 2, 3)
plt.imshow(images[2], 'gray'),plt.title(titles[2])
plt.xticks([]),plt.yticks([])
#第四張圖
plt.subplot(2, 2, 4)
plt.imshow(images[3], 'gray'),plt.title(titles[3])
plt.xticks([]),plt.yticks([])
plt.savefig(r"D:\HuaweiMoveData\Users\27182\Desktop\py\Canny.png",dpi=1000)
plt.show()
5.Canny算子效果展示
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-728122.html
6.參考文章及致謝
本章內(nèi)容的完成離不開(kāi)以下大佬文章的啟發(fā)和幫助,在這里列出名單,如果對(duì)于內(nèi)容還有不懂的,可以移步對(duì)應(yīng)的文章進(jìn)行進(jìn)一步的理解分析。
1.Canny邊緣檢測(cè)算子流程:https://blog.csdn.net/zaishuiyifangxym/article/details/90142702
2.邊界滯后技術(shù)跟蹤算法:https://blog.csdn.net/qq_44736333/article/details/109152380
我的工作就是根據(jù)兩位大佬的blog來(lái)進(jìn)行學(xué)習(xí),這兩位博主的cv的專欄寫的非常好。
如果大家這這篇blog中有什么不明白的可以去他們倆個(gè)的專欄里面看看,內(nèi)容非常全面,應(yīng)該能夠有比較好的解答。
在文章的最后再次表達(dá)由衷的感謝!!
到了這里,關(guān)于圖像處理與計(jì)算機(jī)視覺(jué)--第五章-圖像分割-Canny算子的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!