Document 7496740

Download Report

Transcript Document 7496740

數位影像處理
第九章 影像分割
班
級:四電四
姓
名:李孟螢
學號:109610339
前言:
•
•
•
•
•
•
•
•
•
•
閥值運算
閥值的應用
設定合適的閥值
可適性閥值運算
邊緣閥值
導數與邊緣
二階導數
Canny 邊緣偵測
Houngh 轉換
在MABLAB中執行Houngh轉換
9.1導論
分割(segmentation):
指將影像按照組合的部分分割,或將影像
中各個物件分割開來。
本章節主要探討:閥值運算與邊緣偵測。
9.2 閥值運算
分成兩種1.單一閥值2.雙重閥值
9.2.1 單一閥值
灰階影像要轉為二元(黑白)數位影像,
必須先將原始影像中設定灰階值 T,依照每
個像素灰階值大小,將像素轉換黑色或白色
:
灰階值 > T,像素轉換成白色
灰階值 ≦ T,像素轉換成黑色
利用MATLAB 來進行閥值運算,將8位元
影像儲存成變數 X。使用imshow來檢測結果。
下圖影像是暗色背景中散落著淺色稻殼
>> r = imread ( ‘ rice.tif ’ ) ;
>> imshow ( r ) , figure , imshow ( r > 110 )
圖9.1
而淺素背景暗色物體的影像也可以利用相
同的處理方式 :
>> b = imread ( ‘ bacteria.tif ’ ) ;
>> imshow ( b ) , figure , imshow ( b > 100 )
圖9.2
向量化代表將整個矩陣或向量進行一項
運算可以不必透過迴圈或一組巢狀迴圈來進
行運算。指令 X > T 會將像素灰階值大於 T
者轉換成 1 ,而小於或等於 T 者轉換成 0 ,
得到的 0 或 1 的矩陣,就是二元數位影像。
除了上面的方法,在MATLAB還可使用函
數 im2bw,對任何資料型態的影像進行閥值
運算,一般語法如下:
>> im2bw ( image , level ) ;
以下是圖9.1 9.2 的另一個方法
>> im2bw ( r , 0.43 ) ;
>> im2bw ( b , 0.39 ) ;
除了可以從影像中擷取某個物體,閥值
運算還可以顯示影像中隱藏的特性。
例如影像paper.tif看起來是全白,因為所
有的灰階值都很高。但設定高數值的閥值,結
果會出現超多黑點。
>> p = imread(‘ paper.tif ’) ;
>> imshow ( p ) , figure , imshow ( p > 124 )
圖9.3白紙運算閥值
9.2.2 雙重閥值
設定閥值 T1 與 T2 :
灰階值介於T1與T2,則像素轉換成白色
灰階值其他數值,則像素轉換為黑色
利用單一閥值的方法加以修,就成可成為雙
重閥值運算:
X > T1 & X > T2
因 & 所以必須兩個不等式成立結果才會為 1。
指令是先將索引影像 spine.tif 轉換成八
位元灰階影像,然後再進行閥值運算:
>> [ x , map ] = imread(‘ spine.tif ’) ;
>> s = uint8 ( 256 * ind2gray ( x , map ) );
>> imshow ( s ) , figure , imshow ( s > 115 & s < 125 );
結果雙重閥值顯示出脊椎一些比較細緻部
分,這是單一閥值無法做到。也使用im2bw得
到相似結果。
>> imshow ( im2bw ( x , map , 0.45 ) & ~ im2bw ( x , map , 0.5 ) )
閥值計算後
原始影像
圖9.4
9.3 閥值的應用
閥值運算可適用於下列情況:
1.去除影像中不需要的細節,留下基礎要素。
2.顯示影藏的特性。
3. 還可用於其他用途,如將文字或雜亂背景
去除。
雜亂背景去除的例子
>> r = read ( 256 ) * 128 + 127 ;
>> t = imread ( ‘ text.tif ‘ );
>> s = uint8 ( r * double ( not ( t ) ) );
>> imshow ( s ) , figure , imshow ( s > 115 & s < 125 );
>> imshow ( tr > 100)
圖9.5
9.4 設定適合的閥值
閥值運算中計算物體的大小或數量,必須設
定適合的閥值。設定數值太大或太小都會有影響
。假設利用im2bw進行閥值運算,閥值 t 的範圍
為0<t<1。
圖9.6
要找到適合閥值的方
法就是將影像直方圖視為
一種機率分布,這最佳閥
值法叫做Otsu演算法。
Otsu 演算法可以利用
MATLAB中函數 graythresh
執行。左圖為函數計算出
的結果。
再利用im2bw對影像進行閥值運算:
>>imshow ( im2bw ( n , tn ))
>>figure,imshow ( im2bw ( r, tr ))
>>figure,imshow ( im2bw ( b, tb ))
>>figure,imshow ( im2bw ( e , te ))
圖9.7
9.5 可適性閥值運算
有時單一閥值是不能完全取出物體影像。這
在物體與背景亮度不均勻狀況下就有可能發生。
例如:將背景與圓形亮度不均來做閥值運算
>> c = imread(‘circles.tif’);
>> x = ones(256,1)*[1:256];
>> c2 = double(c).*(x/2+50)+(1-double(c)).*x/2;
>> c3 = uint8(255*mat2gray(c2));
>> t = graythresh(c3);
>> ct = im2bw(c3,t);
>> figure,imshow(c3),figure,imshow(ct);
結果不佳,不是每個物體都可以從背景擷取出
來,無論在哪一層都無法將圓形從背景取出。
圓形影像 c3
利用閥值計算 ct
圖9.8
依照上面的情形可以將影像切成小塊,
再去對每一塊分別設定閥值。
>> p1=c3(:,1:64);
>> p2=c3(:,65:128);
>> p3=c3(:,129:192);
>> p4=c3(:,193:256);
>> g1=im2bw(p1,graythresh(p1));
>> g2=im2bw(p2,graythresh(p2));
>> g3=im2bw(p3,graythresh(p3));
>> g4=im2bw(p4,graythresh(p4));
>> imshow([g1 g2 g3 g4])
將影像切割
分別進行閥值運算
圖9.9
9.6 邊緣偵測
所謂的邊緣指的是像素值之間可見的差
異可以用邊緣來測量影像中物體大小,從背
景取出特定物體,加以辨識及分類物體。而
最常用在邊緣偵測的MATLAB指令為:
edge ( image , ‘ method ‘parameters . . . )
圖9.10第二行第三行的灰階值很明顯不
同數值,差異超過 100。就算用肉眼也可以
察覺這樣灰階值的差異,這章節目的是要找
出真測影像邊緣的方法。
圖9.10
9.7導數及邊緣
從圖9.11左至右的灰階值,就可發現兩
種邊緣:灰階值變化緩慢的斜坡邊緣 (ramp
edge) ,和灰階值忽然改變的階梯邊緣 (step
edge) 或是理想邊緣 ( ideal edge )。
圖9.11
假設圖9.11剖面函數為f(x),則導數為
f ‘(x),為圖9.12。剖面中保持不變的其導數
為 0,起伏或是有差異的則非 0。
圖9.12
其大小
,
9.7.2 一些邊緣偵測濾波器
水平與垂直濾波器可以偵測到影像中水
平與垂直的邊緣,影像就會出現合理的亮度。
但結果影像的邊緣可能會有顫抖。
搭配Prewitt濾波器( Prewitt filters ) 從
另一個方向來平滑影像就可以改善了。
依實際例子:
>>ic=imread('ic.tif');
>> px=[-1 0 1;-1 0 1;-1 0 1];
>> icx=filter2(px,ic);
>> figure,imshow(icx/255)
>> py=px';
>> icy=filter2(py,ic);
>> figure,imshow(icy/255)
原始影像
凸顯垂直邊緣
凸顯水平邊緣
圖9.13 代入 Prewitt 濾波器
我們也可以產生凸顯所有邊緣的影像:
>> edge_p=sqrt(icx.^2+icy.^2);
>> figure,imshow(edge_p/255)
>> edge_t=im2bw(edge_p/255,0.3);
>> figure,imshow(edge_t)
凸顯邊緣
再經過閥值運算
圖9.14
可以直接使用指令執行preaitt偵測邊緣
濾波器。
>> edge_p=edge(ic,'prewitt');
>> figure,imshow(edge_p);
圖9.15 edge 函數使用Prewitt濾波器
圖9.15與9.14有所不同,原因是函數
edge除了取濾波器平方總合的平方根,還
做了額外的運算。
還有其他邊緣偵測濾波器,Roberts 交
叉梯度濾波器和Sobel濾波器。兩者執行結
果非常相素,會以中心的差異濾波器的反方
向再執行平滑濾波器。
>> edge_r=edge(ic,‘roberts’);
>> figure,imshow(edge_r)
>> edge_s=edge(ic,‘sobel’);
>> figure,imshow(edge_s)
Roberts濾波結果
Sobel濾波結果
圖9.16
三個濾波器中,Sobel濾波器效果可能
最好,邊緣偵測明顯,即使有雜訊仍有一的
效果。
9.8二階導數
水平及垂直兩方向的二階導數總和稱為
Laplacian ,可使用二階導數進行邊緣偵測
。不過二階導數雜訊的缺點是非常容易受到
雜訊干擾。而Laplacian (取絕對值或平方後)
會產生雙重邊緣。
雖然執行完離散Laplacian濾波結果無誤
,但與之前的Prewitt和Sobel方法比較,仍
然雜亂許多。
離散Laplacian
濾波結果
Sobel濾波結果
edge 函數
使用Prewitt濾波器
9.8.2 零交錯
Laplacian濾波器比較適合用來找出零交錯
( zero crossings ) 的位置濾波結果出來為零的地
方則是邊緣位置,通常都是濾波後改變正負號的
地方。而濾波後必須符合以下條件:
1.灰階值為負,且要和灰階值為正的像素直角相
鄰。
2.像素值為零,且必須介於正和負的像素之間。
但結果並不理想,太多灰階值改變的地
方被視為邊緣了。要去除這誤差可以利用
Marr-Hildreth 方法 :
1.使用高絲濾波器來平滑影像。
2.使用Laplacian濾波器對結果進行旋積。
3.找出零交錯。
這方法偵測出的邊緣與生物視覺相近。使用Log
參數和zerocross參數,差異在於zerocross可以
自行設定濾波器,代入Log濾波器然後再找零交
錯的結果。
零交錯偵測邊緣
先使用Log濾波器
9.9 Canny邊緣偵測
Canny邊緣偵測,設計滿足邊緣偵測的三項
要求:
1.降低錯誤率
2.邊緣定位
3.單一反應
Canny邊緣偵測
edge(ic,'canny',[0,0.05]);
edge(ic,'canny',[0.01,0.5]);
9.10Hough轉換
Hough轉換(Hough Transform)原本設
計用於偵測影像中的線條,但修改一下也可
以偵測其他形狀,影像中的每個點都掉轉換
域的一條直線上。轉換域上最多交叉線的點
會對應到影像中最明顯的那條線。不過
Hough轉換法仍然無法偵測到垂直線條。
9.11 在MATLAB中執行Hough轉換
利用hough.m的副程式:
>>c=imread('cameraman.tif');
>> hc=hough(c);
>> imshow(mat2gray(hc)*1.5)
>>max(hc(:))
>> [r,theta]=find(hc==95)
利用Hough轉換後結果
>>c=imread('cameraman.tif');
>>c2=imadd(imdivide(c,4),192);
>>imshow(c2)
>>houghline(c2,r,theta)
使用C2目的是為了讓影像亮度,更清晰
執行houghline
>> [r,theta]=find(hc>80)
>> houghline(c,r(8),theta(8))
>> houghline(c,r(6),theta(6))
END~