個人簡介:?
> ??個人主頁:趙四司機
> ??學習方向:JAVA后端開發(fā)?
> ?往期文章:SpringBoot項目整合微信支付
> ??博主推薦網站:??途W 刷題|面試|找工作神器
> ??種一棵樹最好的時間是十年前,其次是現(xiàn)在!
> ??喜歡的話麻煩點點關注喔,你們的支持是我的最大動力。
前言:
實驗中要求能夠自行評價Log、Canny算子在無噪聲條件下和噪聲條件下的分割性能。能夠掌握分割條件(閾值等)的選擇。完成規(guī)定圖像的處理并要求正確評價處理結果,能夠從理論上作出合理的解釋。通過實驗體會一些主要的分割算子對圖像處理的效果,以及各種因素對分割效果的影響。
目錄
一:相關概念
1.一階導數二階導數在圖像邊緣中的應用?
2.邊緣檢測基本步驟
3.好的邊緣檢測遵循的原則
4.二階微分(差分)算子
二:拉普拉斯算子
1.等效式
2.拉普拉斯算子
????3.拉普拉斯算子缺點?
三:高斯-拉普拉斯算子(Log)
1.相關概念
2.Log邊緣檢測
(1)基本特征
(2) 代碼實戰(zhàn)
(3)結果分析
四:Canny邊緣檢測
1.相概念
2.檢測步驟
3.代碼實戰(zhàn)
4.結果分析?
五:思考總結
一:相關概念
1.一階導數二階導數在圖像邊緣中的應用?
- 一階導數可以用于檢測圖像中的一個點是否是邊緣點(判斷一個點是否在斜坡上);
- 二階導數可以用于判斷一個邊緣像素是在邊緣亮的一邊還是暗的一邊。?
2.邊緣檢測基本步驟
- 濾波:邊緣檢測算法主要是基于圖像強度的一階和二階導數,但導數的計算對噪聲很敏感,因此必須使用濾波器來改善與噪聲有關的邊緣檢測器的性能.需要指出,大多數濾波器在降低噪聲的同時也導致了邊緣強度的損失,因此,增強邊緣和降低噪聲之間需要折衷。
- 增強:增強邊緣的基礎是確定圖像各點鄰域強度的變化值.增強算法可以將鄰域(或局部)強度值有顯著變化的點突顯出來.邊緣增強一般是通過計算梯度幅值來完成的。
- 檢測:在圖像中有許多點的梯度幅值比較大,而這些點在特定的應用領域中并不都是邊緣,所以應該用某種方法來確定哪些點是邊緣點.最簡單的邊緣檢測判據是梯度幅值閾值判據。
- 定位:如果某一應用場合要求確定邊緣位置,則邊緣的位置可在子像素分辨率上來估計,邊緣的方位也可以被估計出來?
3.好的邊緣檢測遵循的原則
-
有好的檢測率:
-
?最優(yōu)的檢測器應該能檢測出所有真實邊緣,而忽略噪聲和其他瑕疵
-
-
有好的局部化效果:
-
?檢測到的邊緣必須盡可能的靠近真實邊緣
-
對于每個真實邊緣點,檢測器必須返回一個點
-
4.二階微分(差分)算子
????????如果所求的一階導數高于某一閾值,則確定該點為邊緣點,這樣做會導致檢測的邊緣點太多。?一種更好的方法就是求梯度局部最大值對應的點,并認定它們是邊緣點,通過去除一階導數中的非局部最大值,可以檢測出更精確的邊緣。?一階導數的局部最大值對應著二階導數的零交叉點。這樣,通過找圖像強度的二階導數的零交叉點就能找到邊緣點。
二:拉普拉斯算子
1.等效式
???
2.拉普拉斯算子
????
- 二階微分關心的是圖像灰度的突變而不強調灰度緩慢變化的區(qū)域,對邊緣的定位能力更強。
- ?Laplace算子是各項同性的,即具有旋轉不變性
????3.拉普拉斯算子缺點?
- 拉普拉斯的二階方向導數算子在機器視覺中并不常用, 因為任何包含有二階導數的算子比只包含有一階導數的算子更易受噪聲的影響.甚至一階導數很小的局部峰值也能導致二階導數過零點.
- 為了避免噪聲的影響,必須采用特別有效的濾波方法.
- 邊緣的方向信息丟失。
三:高斯-拉普拉斯算子(Log)
1.相關概念
????????Marr和Hildreth將高斯濾波和拉普拉斯邊緣檢測結合在一起,首先用高斯函數先進行低通濾波,然后利用拉普拉斯算子進行高通濾波并提取零交叉點,形成LoG(Laplacian of Gaussian)算法,也稱之為拉普拉斯高斯算法.?
??
2.Log邊緣檢測
(1)基本特征
- 平滑濾波器是高斯濾波器.
- 采用拉普拉斯算子計算二階導數.
- 邊緣檢測判據是二階導數零交叉點并對應一階導數的較大峰值.
- 使用線性內插方法在子像素分辨率水平上估計邊緣的位置.??
- 為什么使用高斯濾波器:
- 逼近必須能夠抑制噪聲效應
- 必須盡量精確地確定邊緣的位置??
- 但平滑去噪和邊緣檢測是一對矛盾,抑制噪聲和邊緣精確定位是無法同時得到滿足的。應用高斯函數的一階導數,在二者之間獲得最佳的平衡。
(2) 代碼實戰(zhàn)
對圖像加入不同噪聲之后使用Log算子進行邊緣檢測:
I = rgb2gray(imread('image\room.tif'));
J=imnoise(f,'gaussian',0.1);
BW1 = edge(I,'log',0.004); % σ=2
BW2 = edge(J,'log',0.012,2); % σ=2
figure(1),subplot(121),imshow(J),title('gaussian = 0.1');
subplot(122),imshow(BW2);title('THRESH = 0.012 σ=2');
imshow(BW1);title('σ=2')
BW1 = edge(I,'log',0.004,3); % σ=3
figure, imshow(BW1);title('σ=3')
??
圖3.4-1 Log算子(Sigma = 2)
??
圖3.4-2 Log算子(Sigma = 3)
??
圖3.4-3 Log算子(加入高斯0噪聲,Sigma=2)
??
圖3.4-4 Log算子(加入強度0.1高斯噪聲,THRESH=0.01,Sigma=2)
??
圖3.4-5 Log算子(加入強度0.1高斯噪聲,THRESH=0.012,Sigma=2)
(3)結果分析
????????Log算子我采用了matlab自帶的函數進行實驗,edge(I,'log',THRESH,SIGMA)
可以看到有兩個參數,THRESH表示函數忽略所有強度不大于THRESH值的邊緣,SIGMA作為LoG過濾器的標準差。
????????LoG算子將高斯濾波和拉普拉斯邊緣檢測結合在一起,首先用高斯函數先進行低通濾波,然后利用拉普拉斯算子進行高通濾波并提取零交叉點??梢钥吹教幚斫Y果的圖像邊緣較平滑(見圖3.4-1),是因為LoG算子不能檢測邊緣方向。而且在加入噪聲之后,可以看到LoG算子對噪聲十分敏感(見圖3.4-3),不斷調整參數,最終在參數THRESH=0.012,Sigma=2時得到較好的結果(見圖3.4-5),但是還是損失了很多邊緣信息。
四:Canny邊緣檢測
1.相概念
????????Canny邊緣檢測是一種非常流行的邊緣檢測算法,計算機視覺中用得最廣的邊緣檢測器,是John Canny在1986年提出的(發(fā)表在PAMI)。
????????理論模型:加性噪聲干擾的階梯邊緣(Step-Edge) Canny展示了高斯函數的一階導緊密逼近最優(yōu)化信噪比和局部化的邊緣算子?
2.檢測步驟
步驟1.?圖像與高斯平滑濾波器卷積:
步2. 使用一階有限差分計算偏導數陣列P與Q:
步驟3. ?計算梯度幅值與方向角:
步驟4. 非極大值抑制(NMS ) :
????去掉幅值局部變化非極大的點.
????* 將梯度角離散為圓周的四個扇區(qū)之一,以便用3×3的窗口作抑制運算
? ?* 方向角離散化:
????
? ?* 抑制,得到新幅值圖:
??
步驟5. 閾值化
取高低兩個閾值作用于幅值圖N[i,j],得到兩個邊緣圖:高閾值和低閾值邊緣圖。連接高閾值邊緣圖,出現(xiàn)斷點時,在低閾值邊緣圖中的8鄰點域搜尋邊緣點。
3.代碼實戰(zhàn)
% I = rgb2gray(imread('image\room.tif'));
% J=imnoise(I,'gaussian',0);
% BW1 = edge(I,'canny',0.1);
% BW2 = edge(J,'canny',0.175,1.9);
% figure(2),subplot(121),imshow(J),title('加入gaussian噪聲原圖');
% figure(2),subplot(122),imshow(BW2),title('加入gaussian噪聲后檢測結果');
% figure(1),subplot(121),imshow(I),title('原圖');
% subplot(122),imshow(BW1);title('自帶函數Canny邊緣檢測');
% 自編程實現(xiàn)canny算子
% image = rgb2gray(imread('image\lena.png'));
% image=imnoise(image,'gaussian',0);
image = imread('image\figure.png');
image = rgb2gray(image);
subplot(221);
imshow(image);
title('原始圖像');
image = double(image)/256;
[m,n] = size(image);
w = fspecial('gaussian');
image_1 = imfilter(image,w,'replicate');
subplot(222);
imshow(int8(256*image_1));
title('高斯濾波后的圖像');
% 梯度計算
op = fspecial('sobel')/4; % 用Sobel算子來求導數
x = op';
y =op;
bx = imfilter(image_1,x,'replicate');
by = imfilter(image_1,y,'replicate');
b_abs = sqrt(bx.*bx+by.*by); % 求梯度的幅值
b_angle = angle(by-1i*bx);
b_ang = b_angle/3.1416*180; % 求梯度的方向
% 梯度方向確定
dir=ones(m,n);
for r = 1:m
for c = 1:n
if((b_ang(r,c)>=22.5 && b_ang(r,c)<67.5)|| (b_ang(r,c)>=-157.5 && b_ang(r,c)<-112.5))
dir(r,c) = 1;
elseif ((b_ang(r,c)>=67.5 && b_ang(r,c)<112.5)|| (b_ang(r,c)>=-112.5 && b_ang(r,c)<-67.5))
dir(r,c) = 2;
elseif ((b_ang(r,c)>=112.5 && b_ang(r,c)<157.5)|| (b_ang(r,c)>=-67.5 && b_ang(r,c)<-22.5))
dir(r,c) = 3;
else
dir(r,c) = 0;
end
end
end
% 遍歷圖像(抑制非極大值)
b_ab = [zeros(m,1),b_abs,zeros(m,1)]; % 串聯(lián)矩陣
b_ab = [zeros(1,n+2);b_ab;zeros(1,n+2)];
b1=ones(m,n);
for r = 2:m+1
for c = 2:n+1
switch dir(r-1,c-1)
case 0
if((b_ab(r,c)<b_ab(r+1,c))|| (b_ab(r,c)<b_ab(r-1,c)))
b1(r-1,c-1) = 0;
else
b1(r-1,c-1) = b_ab(r,c);
end
case 1
if((b_ab(r,c)<b_ab(r+1,c-1))|| (b_ab(r,c)<b_ab(r-1,c+1)))
b1(r-1,c-1) = 0;
else
b1(r-1,c-1) = b_ab(r,c);
end
case 2
if((b_ab(r,c)<b_ab(r,c-1))|| (b_ab(r,c)<b_ab(r,c+1)))
b1(r-1,c-1) = 0;
else
b1(r-1,c-1) = b_ab(r,c);
end
case 3
if((b_ab(r,c)<b_ab(r-1,c-1))|| (b_ab(r,c)<b_ab(r+1,c+1)))
b1(r-1,c-1) = 0;
else
b1(r-1,c-1) = b_ab(r,c);
end
end
end
end
% 高閾值保留
b2=ones(m,n);
for r = 1:m
for c = 1:n
if (b1(r,c)>0.5)
b2(r,c) = 0;
else
b2(r,c) = 1;
end
end
end
% 低閾值舍棄
b3=ones(m,n);
for r = 1:m
for c = 1:n
if(b1(r,c)<0.08)
b3(r,c) = 1;
else
b3(r,c) = 0;
end
end
end
% 介于高低閾值之間
image_2 = b2;
for r = 2:m-1
for c = 2: n-1
if (image_2(r,c)== 1 && (b3(r,c)==0||b3(r+1,c)==0 ...
||b3(r+1,c-1)==0||b3(r+1,c+1)==0||b3(r,c-1)==0 ...
||b3(r,c+1)==0||b3(r-1,c-1)==0||b3(r-1,c)==0 ...
||b3(r-1,c+1)==0))
image_2(r,c) = 0;
else
image_2(r,c) = 1;
end
end
end
%去除黑邊
image_2(1,:) = 1;
image_2(m,:) = 1;
image_2(:,1) = 1;
image_2(:,n) = 1;
subplot(223);
imshow(image_2);
title('Canny算子檢測后的圖像');
4.結果分析?
??
圖3.5-1 Matlab自帶canny函數檢測結果
圖3.5-2 Matlab自帶canny函數檢測加入高斯噪聲圖像結果?
圖3.5-3 自編程實現(xiàn)canny算子檢測結果
??
圖3.5-4 自編程實現(xiàn)canny算子檢測加入高斯噪聲圖像結果
????????Canny算子能夠有效地抑制噪聲,且其根據信噪比與定位比乘積進行測度,得到最優(yōu)化逼近算子,能較精確確定邊緣的位置。類似于LoG邊緣檢測方法,Canny也屬于先求平滑后求導數的方法。Canny邊緣檢測算法可以簡化為四個步驟:
步驟1:用高斯濾波器平滑處理原圖像;
步驟2:用一階偏導的有限差分進行計算梯度的幅值和方向;
步驟3:對梯度幅值進行非極大值抑制;
步驟4:用雙閾值算法檢測和連接邊緣
????????使用平滑濾波的原因從根本上來說是邊緣檢測算子中的導數計算。導數計算對噪聲十分敏感,如果不提前使用濾波器加以改善,則在導數計算后,噪聲將會被放大,使得檢測出來的虛假邊緣變多,不利于邊緣的提取。但是平滑濾波雖然能有效抑制噪聲,但是會使得圖像邊緣模糊,增加了邊緣檢測的不確定性,但是噪聲帶來的影響更大,因此首先應考慮去除噪聲。圖像的邊緣有方向和幅度兩個屬性,沿邊緣方向像素變化平緩,垂直于邊緣方向像素變化劇烈,邊緣上的這種變化可以用微分算子檢測出來,通常用一階或二階導數來檢測邊緣。在這里選用一階導數來檢測邊緣,即求一階導數最大值。設M(x,y)代表幅值,當其取得局部最大值時,其對應的梯度方向θ(x,y)反映了邊緣的方向(邊緣方向與梯度方向垂直)。得到全局梯度之后,還不能確定邊緣,還需要保留局部梯度最大的點,且還要抑制非極大值,即將非局部最大值的像素點置為0。這就需要利用梯度的方向,與領域像素的梯度幅值進行比較,在程序中我采用的是3*3的窗口做抑制運算,對每個像素點與沿著梯度方向的兩個八領域像素的梯度進行比較,最后選取梯度值最大的點。這樣就基本排除了非邊緣信息,僅僅保留了一些細的線條,即候選邊緣。最后還需要采用雙閾值法來檢測和連接邊緣,將高于高閾值的像素點保留,將低于低閾值的像素點排除,若高閾值圖像邊緣出現(xiàn)0值像素點,則判斷該像素點低閾值圖像8領域空間的像素是否存在高于高閾值的像素,如果存在則該像素被保留(像素值置為1),否則被排除,至此就實現(xiàn)了Canny邊緣檢測。
????????從實驗結果(見圖3.5-3)來看,Canny算子檢測出來的邊緣信息更準確,顯示出來的邊緣線條較細。且在加入噪聲之后,由于前面利用平滑濾波過濾了噪聲,最后得到的邊緣檢測結果也還是較滿意的(見圖3.5-4),但是由于原圖像有些邊緣周圍的像素值較小,且變化較平緩,例如屋頂區(qū)域,在進行平滑濾波時容易將邊緣信息抹除,故最終檢測結果屋頂部分的邊緣便消失了。
五:思考總結
(1)評價一下Roberts 算子、Prewitt 算子、Sobel 算子對于噪聲條件下邊界檢測的性能。
????????從上面的檢測結果來看,Roberts算子采用的是2*2的模板,對噪聲比較敏感,對有噪聲的圖像處理能力不強;而Prewitt算子采用的是3*3的模板,其抗噪能力要強一些,但是效果也不是很理想;對于Sobel算子,其在Prewitt算子升增加了權重的概念,具有平滑噪聲的作用,因此其對有噪聲圖像的邊緣檢測能力要比另外兩個算子強。
(2)為什么LoG梯度檢測算子的處理結果不需要象Prewitt 等算子那樣進行幅度組合?
????????因為LoG算子采用拉普拉斯算子計算二階導數,且邊緣檢測判據是二階導數零交叉點并對應一階導數的較大峰值,還使用線性內插方法在子像素分辨率水平上估計邊緣的位置。
(3)實驗中所使用的四種算子所得到的邊界有什么異同?
????????Roberts、Prewitt、Sobel算子得到的邊緣信息較粗,定位都不是很準確,而LoG算子得到的邊緣信息定位較準確,且得到的邊緣線條較細。對于有噪聲的圖像,Roberts、Prewitt、LoG算子都對噪聲比較敏感,處理能力一般,而Sobel算子能對噪聲進行平滑,其對噪聲圖片的邊緣檢測要比另外三個好。
(4)比較邊緣提取中LOG、Canny算子的邊緣提取效果。文章來源:http://www.zghlxwxcb.cn/news/detail-778805.html
????????相同尺度下的LOG算子總是能比Canny算子檢測出更多的細節(jié),Canny算子能對真正比較顯著地邊緣給出檢測。LOG算子容易受尺度的影響,不同尺度下的邊緣點要用不同尺度的LOG算子檢測,Canny 算子受尺度的影響不太明顯,不同尺度下,邊緣點的位置都有偏差,但幾乎相同;從對噪聲的敏感程度來看,LOG邊緣檢測子是采用二階導數過零點的檢測方法,故對噪聲更敏感一些,因此從抑制噪聲方面來講,Canny邊緣檢測子不容易受到噪聲的干擾,而相同尺度下LOG算子卻容易受到噪聲的干擾,抑制噪聲的能力要弱一些。LOG算子對噪聲的抑制能力隨著尺度的增加而增加,相同尺度下的Canny算子比LOG算子的抗噪聲能力強,而LOG算子比Canny算子的邊緣點準確;對于弱邊緣,由于Canny邊緣檢測子采用兩種不同的閾值分別檢測強邊緣和弱邊緣,并且當弱邊緣和強邊緣相連時,才將弱邊緣包含在輸出圖像中,故而Canny算子更能檢測出真正的弱邊緣,但是Canny邊緣檢測子檢測出的邊緣的位置會有一定范圍的誤差;對于假邊緣,LOG邊緣檢測子相對比較容易受到噪聲干擾,會檢測出更多的細節(jié),也容易檢測出一些由于噪聲引起的假邊緣,但是LOG邊緣檢測子對邊緣位置的檢測還是很準確的。文章來源地址http://www.zghlxwxcb.cn/news/detail-778805.html
到了這里,關于【計算機視覺】圖像分割與特征提取——基于Log、Canny的邊緣檢測的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!