MATLAB數字圖像的腐蝕、填充、細化與粗化_第1頁
MATLAB數字圖像的腐蝕、填充、細化與粗化_第2頁
MATLAB數字圖像的腐蝕、填充、細化與粗化_第3頁
MATLAB數字圖像的腐蝕、填充、細化與粗化_第4頁
MATLAB數字圖像的腐蝕、填充、細化與粗化_第5頁
已閱讀5頁,還剩5頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、數字圖像處理實驗報告姓名 學號 專業 電子科學與工程學院實驗 5一、 實驗目的本次實驗的處理對象是二值圖像,關于二值圖像的處理運算主要包括腐蝕和膨脹。它們是其他處理過程的主要運算環節。開閉操作通過腐蝕和膨脹的不同順序組合,能夠使圖像平滑,開閉操作再組合能夠成噪聲濾波器。形態學中的擊中擊不中變換也應用了腐蝕的運算,用于判斷圖像中能否找到目標結構,這在圖像細化中也得到了應用。本次實驗主要實現:1 圖像的邊緣提?。? 在邊緣提取的基礎上實現區域填充;3 在區域填充的基礎上實現圖像細化;4 在圖像細化的基礎上實現圖像粗化。在Matlab軟件的自帶函數庫中其實本身就包含有以上處理過程的函數,為了深入理解

2、每種處理過程的原理,本次實驗所有運算都自行編寫實現。二、 核心代碼及運行后截圖主函數:% 讀取圖像clear;clc;I = imread('onepiece.jpg');I = im2bw(I);% 轉換為二值圖像m,n = size(I); % 邊界提取f = im2bw(0,1,0;1,1,1;0,1,0);% 腐蝕用的結構元素F = fs(I,f);BW = im2bw(I-F);% 用原圖減去腐蝕獲得邊緣figure;imshow(I);title('原圖');figure;imshow(F);title('腐蝕圖像');figure;

3、imshow(BW);title('邊界'); 在上面的運行效果圖上看來,由于原圖選擇的原因,周圍一圈白線有一定寬度但不足夠粗,大概只有23個像素寬度而腐蝕用元素大小為3×3,這導致腐蝕后圖像留下的白線看起來殘缺不全,用原圖減去腐蝕后得到的邊緣圖像也在白線處有“粘在一塊”的現象。只要使用更高一些分辨率的圖片即可避免這樣的情況。但出于后續試驗的運行速度考慮,本實驗就使用此圖(300×300)。觀察圖像其他地方,有足夠的像素寬度被腐蝕,由此提取的邊緣也很清晰。% 區域填充I1 = fillbw(BW,40,40);% fillbw函數實現指定坐標填充邊緣內部,詳

4、見主函數后的各子函數I1 = I1 | fillbw(BW,40,260);% 為避免不必要的計算量,每次填充迭代次數為70I1 = I1 | fillbw(BW,100,150);% 逐次在圖像中選擇需填充區域中的起始點以完成填充I1 = I1 | fillbw(BW,100,160);I1 = I1 | fillbw(BW,136,86);I1 = I1 | fillbw(BW,132,212);I1 = I1 | fillbw(BW,147,120);I1 = I1 | fillbw(BW,157,214);I1 = I1 | fillbw(BW,210,171);I1 = I1 | f

5、illbw(BW,206,109);I1 = I1 | fillbw(BW,233,129);I1 = I1 | fillbw(BW,234,140);I1 = I1 | fillbw(BW,237,153);I1 = I1 | fillbw(BW,234,167);I1 = I1 | fillbw(BW,231,178);I1 = I1 | fillbw(BW,248,125);I1 = I1 | fillbw(BW,252,142);I1 = I1 | fillbw(BW,252,162);I1 = I1 | fillbw(BW,247,182);I1 = I1 | fillbw(BW,2

6、72,149);I1 = I1 | fillbw(BW,256,50);I1 = I1 | fillbw(BW,253,248);I2 = I1 | F;% 因外圍白線邊緣之間沒有足夠空間,很難逐個填充空洞figure;% 故此處直接疊加腐蝕圖像,把外圍白線加上subplot(1,3,1);imshow(I);title('原圖');subplot(1,3,2);imshow(I1);title('區域填充');subplot(1,3,3);imshow(I2);title('區域填充+腐蝕'); 實際上邊緣圖像是由原圖像減去腐蝕圖像得到的,而區

7、域填充是在邊緣圖像的區域內填滿的結果,故理論上來說最后區域填充的結果其實就是原來的腐蝕圖像。從上圖比較就可以看出,除了區域填充中未填的外圍白線外,疊加了腐蝕圖像的結果與區域填充是一樣的,也與腐蝕圖像一樣(具體可以查看附件中的”區域填充.jpg”、”腐蝕.jpg”和”區域填充+腐蝕.jpg”)。% 細化A1 = fs(I2,20);figure;imshow(A1); 實驗效果圖顯示細化結果良好,表征了原圖像的主要骨架特征。在實現細化算法過程中,一開始在判定是否滿足結構元素時采用的方法是實現寫好一個元胞數組Bk,然后在程序中調用數組進行比較。后來發現這樣的運算速度大大降低,改為在程序中現寫結構元

8、素矩陣。% 粗化A2 = fs(A1,2);figure;imshow(A2);從上圖看出在細化得到的骨架基礎上,粗化得到的結果已經失去了原圖像骨架之外的信息了,只能夠把骨架大致的等寬度變粗而已。雖然粗化與細化在運算上是對偶的,但不同于加減法、乘除法的對偶,由于細化過程中圖像逐個減去判定擊中點,余留圖像的信息量實際在減少,作為骨架的剩余信息已不足夠做恢復原狀的逆運算。圖像中粗化線條中摻雜了很多間斷,這是由于間斷處兩邊在判定擊中而粗化后,中間點的形狀不能滿足判定結構元素中的任何一個,故不作為擊中點而沒有填白。子函數:function Y = fs( A,f )% fs函數實現用結構元素模板f將圖

9、像A腐蝕% 輸入:A被腐蝕圖像% f結構元素,此函數只編寫了方形情% 況,大小可自定義m,n = size(A);% 獲取圖像大小 l = (size(f)-1)/2;Y = im2bw(zeros(m,n);% 初始化輸出為0矩陣for i = 1+l:m-l% 遍歷圖像中3×3區域,若能放下結構元素f,則該點填白 for j = 1+l:n-l if (sum(sum(A(i-l:i+l,j-l:j+l) & f) = sum(f(:) Y(i,j) = 1; end endend endfunction Y = fillbw( A,x,y)%fillbw函數實現在圖像A

10、的第x行、第y列處開始,在邊緣區域內填充白色% 輸入:A需填充圖像% x起始點行數% y起始點列數% 避免小塊區域填充時間過久,迭代次數不宜取過大,為方便調用,本函數在函數內部固定為70次m,n = size(A);YY(:,:,1) = zeros(m,n);% 起始圖像為0矩陣YY(x,y,1) = 1;% 從指定位置開始填充f = 0,1,0;1,1,1;0,1,0;for k = 2:70% 填充迭代70次 YY(:,:,k) = zeros(m,n); for i = 2:m-1% YY(k)為YY(k-1)的膨脹圖像 for j = 2:n-1 if YY(i,j,k-1) = 1

11、 YY(i-1:i+1,j-1:j+1,k) = YY(i-1:i+1,j-1:j+1,k) | f; end end end YY(:,:,k) = YY(:,:,k) & not(A);% 膨脹后與邊界的取反圖像相與,保證不溢出邊界endY = YY(:,:,70);% 輸出為第70次填充結果end function Y = fs( A,count )%fs函數將圖像A細化count次% 輸入:A細化圖像% count細化迭代次數m,n = size(A);Y = A;for k = 1:count% 設定迭代次數YY = ones(m,n);% 初始化中間變量for i = 2:

12、n-1 for j = 2:m-1% 在圖像中尋找8個結構對元素位置并涂黑(即細化) if Y(j-1,i-1) = 0 && Y(j,i-1) = 0 && Y(j+1,i-1) = 0 && Y(j,i) = 1 && Y(j-1,i+1) = 1 && Y(j,i+1) = 1 && Y(j+1,i+1) = 1 YY(j,i) = 0; end endendY = Y & YY;YY = ones(m,n);for i = 2:n-1 for j = 2:m-1 if Y(j,i-1

13、) = 0 && Y(j+1,i-1) = 0 && Y(j+1,i) = 0 && Y(j,i) = 1 && Y(j-1,i) = 1 && Y(j-1,i+1) = 1 && Y(j,i+1) = 1 YY(j,i) = 0; end endendY = Y & YY;YY = ones(m,n);for i = 2:n-1 for j = 2:m-1 if Y(j+1,i-1) = 0 && Y(j+1,i) = 0 && Y(j+1,i+1) = 0

14、 && Y(j,i) = 1 && Y(j-1,i) = 1 && Y(j-1,i+1) = 1 && Y(j-1,i-1) = 1 YY(j,i) = 0; end endendY = Y & YY;YY = ones(m,n);for i = 2:n-1 for j = 2:m-1 if Y(j+1,i) = 0 && Y(j+1,i+1) = 0 && Y(j,i+1) = 0 && Y(j,i) = 1 && Y(j,i-1) = 1 &&am

15、p; Y(j-1,i) = 1 && Y(j-1,i-1) = 1 YY(j,i) = 0; end endendY = Y & YY;YY = ones(m,n);for i = 2:n-1 for j = 2:m-1 if Y(j-1,i-1) = 1 && Y(j,i-1) = 1 && Y(j+1,i-1) = 1 && Y(j,i) = 1 && Y(j-1,i+1) = 0 && Y(j,i+1) = 0 && Y(j+1,i+1) = 0 YY(j,i) = 0

16、; end endendY = Y & YY;YY = ones(m,n);for i = 2:n-1 for j = 2:m-1 if Y(j,i-1) = 1 && Y(j,i) = 1 && Y(j+1,i-1) = 1 && Y(j+1,i) = 1 && Y(j-1,i) = 0 && Y(j-1,i+1) = 0 && Y(j,i+1) = 0 YY(j,i) = 0; end endendY = Y & YY;YY = ones(m,n);for i = 2:n-1 f

17、or j = 2:m-1 if Y(j+1,i-1) = 1 && Y(j+1,i) = 1 && Y(j+1,i+1) = 1 && Y(j,i) = 1 && Y(j-1,i) = 0 && Y(j-1,i+1) = 0 && Y(j-1,i-1) = 0 YY(j,i) = 0; end endendY = Y & YY;YY = ones(m,n);for i = 2:n-1 for j = 2:m-1 if Y(j+1,i+1) = 1 && Y(j+1,i) =

18、1 && Y(j,i+1) = 1 && Y(j,i) = 1 && Y(j-1,i) = 0 && Y(j,i-1) = 0 && Y(j-1,i-1) = 0 YY(j,i) = 0; end endendY = Y & YY;endend三、 實驗分析本次實驗主要程序全部自行編寫完成,主要是在實現算法的過程中理解每種處理方法的原理。二值圖像的處理主要是通過矩陣加減法、邏輯值的與或非運算以及集合的運算。腐蝕運算的形象定義是用一個小元素在原圖像內,保證不超出邊界的移動,其中心移動的位置集合就是腐蝕結果。按照這個定義,在圖像內遍歷每個與結構元素同大小的分塊矩陣,與結構元素做與運算后(保留結構元素非零位置的值)與結構元素比較,若相同則表示結構元素在該位置沒有超出邊界,此處填白。不過處理的圖像區域如果太小,就很難能使結構元素不超出邊界,就會造成實驗圖像外圍白線處理效果不明顯的現象。經過一次腐蝕運算后,大部分情況是圖像的外圍被消除了一圈像素,因此此時用原圖減去腐蝕圖像的話得到的結果就很接近原圖像的邊緣,這是本次實驗中提取邊緣的原理。不過因為外圍白線的腐蝕效果不好,所以其邊緣提取的效果也會不好,看起來是兩條邊緣黏在一起。圖像細化一定程度上算是對圖像的一種特殊的腐蝕過程。用常見的邊緣結構作

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論