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