1. 程式人生 > >matlab膨脹和腐蝕的案例詳解

matlab膨脹和腐蝕的案例詳解

      形態學是提取影象特徵的有力工具,針對二值影象和灰度影象的腐蝕、膨脹和重構的基本操作可以組合使用,以執行非常寬泛的任務。其練習程式碼和結果如下:

  1 %% 第9章 形態學處理
  2 
  3 %% imdilate膨脹
  4 clc
  5 clear
  6 
  7 A1=imread('.\images\dipum_images_ch09\Fig0906(a)(broken-text).tif');
  8 info=imfinfo('.\images\dipum_images_ch09\Fig0906(a)(broken-text).tif')
  9 B=[0 1 0
 10    1
1 1 11 0 1 0]; 12 A2=imdilate(A1,B);%影象A1被結構元素B膨脹 13 A3=imdilate(A2,B); 14 A4=imdilate(A3,B); 15 16 subplot(221),imshow(A1); 17 title('imdilate膨脹原始影象'); 18 19 subplot(222),imshow(A2); 20 title('使用B後1次膨脹後的影象'); 21 22 subplot(223),imshow(A3); 23 title('使用B後2次膨脹後的影象'); 24 25 subplot(224
),imshow(A4); 26 title('使用B後3次膨脹後的影象'); 27%imdilate影象膨脹處理過程執行結果如下:

 28 
 29 %% imerode腐蝕
 30 clc
 31 clear
 32 A1=imread('.\images\dipum_images_ch09\Fig0908(a)(wirebond-mask).tif');
 33 subplot(221),imshow(A1);
 34 title('腐蝕原始影象');
 35 
 36 %strel函式的功能是運用各種形狀和大小構造結構元素
 37 se1=strel('disk',5);%這裡是建立一個半徑為5的平坦型圓盤結構元素
 38
A2=imerode(A1,se1); 39 subplot(222),imshow(A2); 40 title('使用結構原始disk(5)腐蝕後的影象'); 41 42 se2=strel('disk',10); 43 A3=imerode(A1,se2); 44 subplot(223),imshow(A3); 45 title('使用結構原始disk(10)腐蝕後的影象'); 46 47 se3=strel('disk',20); 48 A4=imerode(A1,se3); 49 subplot(224),imshow(A4); 50 title('使用結構原始disk(20)腐蝕後的影象'); 51 %影象腐蝕處理過程執行結果如下: 52
 53 %% 開運算和閉運算
 54 clc
 55 clear
 56 f=imread('.\images\dipum_images_ch09\Fig0910(a)(shapes).tif');
 57 %se=strel('square',5');%方型結構元素 58 se=strel('disk',5');%圓盤型結構元素 59 imshow(f);%原影象
 60 title('開閉運算原始影象')
 61%執行結果如下:

 62 
 63 %開運算數學上是先腐蝕後膨脹的結果
 64 %開運算的物理結果為完全刪除了不能包含結構元素的物件區域,平滑
 65 %了物件的輪廓,斷開了狹窄的連線,去掉了細小的突出部分
 66 fo=imopen(f,se);%直接開運算
 67 figure,subplot(221),imshow(fo);
 68 title('直接開運算');
 69 
 70 %閉運算在數學上是先膨脹再腐蝕的結果
 71 %閉運算的物理結果也是會平滑物件的輪廓,但是與開運算不同的是,閉運算
 72 %一般會將狹窄的缺口連線起來形成細長的彎口,並填充比結構元素小的洞
 73 fc=imclose(f,se);%直接閉運算
 74 subplot(222),imshow(fc);
 75 title('直接閉運算');
 76 
 77 foc=imclose(fo,se);%先開後閉運算
 78 subplot(223),imshow(foc);
 79 title('先開後閉運算');
 80 
 81 fco=imopen(fc,se);%先閉後開運算
 82 subplot(224),imshow(fco);
 83 title('先閉後開運算');
 84%開閉運算結果如下:

 85 
 86 %先膨脹再腐蝕
 87 fse=imdilate(f,se);%膨脹
 88 
 89 %gcf為得到當前影象的控制代碼,當前影象是指例如PLOT,TITLE,SURF等
 90 %get函式為得到物體的屬性,get(0,'screensize')為返回所有物體screensize屬性值
 91 %set函式為設定物體的屬性
 92 figure,set(gcf,'outerposition',get(0,'screensize'));%具體目的是設定當前視窗的大小
 93 subplot(211),imshow(fse);
 94 title('使用disk(5)先膨脹後的影象');
 95 
 96 fes=imerode(fse,se);
 97 subplot(212),imshow(fes);
 98 title('使用disk(5)先膨脹再腐蝕後的影象');
 99%先膨脹後腐蝕影象如下:

100 
101 %先腐蝕再膨脹
102 fse=imerode(f,se);
103 figure,set(gcf,'outerposition',get(0,'screensize'))
104 subplot(211),imshow(fse);
105 title('使用disk(5)先腐蝕後的影象');
106 
107 fes=imdilate(fse,se);
108 subplot(212),imshow(fes);
109 title('使用disk(5)先腐蝕再膨脹後的影象');
110%先腐蝕後膨脹的影象如下:

111 
112 %% imopen imclose在指紋上的應用
113 clc
114 clear
115 f=imread('.\images\dipum_images_ch09\Fig0911(a)(noisy-fingerprint).tif');
116 se=strel('square',3);%邊長為3的方形結構元素
117 subplot(121),imshow(f);
118 title('指紋原始影象');
119 
120 A=imerode(f,se);%腐蝕
121 subplot(122),imshow(A);
122 title('腐蝕後的指紋原始影象');
123%指紋原始影象和腐蝕後的影象結果如下:

124 
125 fo=imopen(f,se);
126 figure,subplot(221),imshow(fo);
127 title('使用square(3)開操作後的影象');
128 
129 fc=imclose(f,se);
130 subplot(222),imshow(fc);
131 title('使用square閉操作後的影象');
132 
133 foc=imclose(fo,se);
134 subplot(223),imshow(foc);
135 title('使用square(3)先開後閉操作後的影象')
136 
137 fco=imopen(fc,se);
138 subplot(224),imshow(fco);
139 title('使用square(3)先閉後開操作後的影象');
140%指紋影象開閉操作過程結果如下:

141 
142 %% bwhitmiss擊中或擊不中變換
143 clc
144 clear
145 f=imread('.\images\dipum_images_ch09\Fig0913(a)(small-squares).tif');
146 imshow(f);
147 title('擊中或不擊中原始影象');
148%擊中或不擊中原始影象顯示結果如下:

149 
150 B1=strel([0 0 0;0 1 1;0 1 0]);%擊中:要求擊中所有1的位置
151 B2=strel([1 1 1;1 0 0;1 0 0]);%擊不中,要求擊不中所有1的位置
152 B3=strel([0 1 0;1 1 1;0 1 0]);%擊中
153 B4=strel([1 0 1;0 0 0;0 0 0]);%擊不中
154 B5=strel([0 0 0;0 1 0;0 0 0]);%擊中
155 B6=strel([1 1 1;1 0 0;1 0 0]);%擊不中
156 
157 g=imerode(f,B1)&imerode(~f,B2)%利用定義來實現擊中或擊不中
158 figure,subplot(221),imshow(g);
159 title('定義實現組1擊中擊不中影象');
160 
161 g1=bwhitmiss(f,B1,B2);
162 subplot(222),imshow(g1);
163 title('結構陣列1擊中擊不中後的影象');
164 
165 g2=bwhitmiss(f,B3,B4);
166 subplot(223),imshow(g2);
167 title('結構陣列2擊中擊不中的影象');
168 
169 g3=bwhitmiss(f,B5,B6);
170 subplot(224),imshow(g3);
171 title('結構陣列3擊中擊不中的影象');
172%擊中擊不中變換後圖像如下:

173 
174 %%makelut
175 clc
176 clear
177 
178 f=inline('sum(x(:))>=3');%inline是用來定義區域性函式的
179 lut2=makelut(f,2)%為函式f構造一個接收2*2矩陣的查詢表
180 lut3=makelut(f,3)
181 
182 %% Conway生命遊戲
183 clc
184 clear
185 lut=makelut(@conwaylaws,3);
186 bw1=  [0     0     0     0     0     0     0     0     0     0
187        0     0     0     0     0     0     0     0     0     0
188        0     0     0     1     0     0     1     0     0     0
189        0     0     0     1     1     1     1     0     0     0
190        0     0     1     0     0     0     0     1     0     0
191        0     0     1     0     1     1     0     1     0     0
192        0     0     1     0     0     0     0     1     0     0
193        0     0     0     1     1     1     1     0     0     0
194        0     0     0     0     0     0     0     0     0     0
195        0     0     0     0     0     0     0     0     0     0  ];
196 subplot(221),imshow(bw1,'InitialMagnification','fit');
197 title('Generation 1');
198 
199 bw2=applylut(bw1,lut);
200 subplot(222),imshow(bw2,'InitialMagnification','fit'),
201 title('Generation 2');
202 
203 bw3=applylut(bw2,lut);
204 subplot(223),imshow(bw3,'InitialMagnification','fit');
205 title('Generation 3');
206 
207 temp=bw1;
208 for i=2:100
209     bw100=applylut(temp,lut);
210     temp=bw100;
211 end
212 subplot(224),imshow(bw100,'InitialMagnification','fit')
213 title('Generation 100');
214%顯示Generation結果如下:

215 
216 %% getsequence
217 clc
218 clear
219 se=strel('diamond',5)
220 decomp=getsequence(se)%getsequence函式為得到分解的strel序列
221 decomp(1)
222 decomp(2)
223 
224 %% endpoints
225 clc
226 clear
227 
228 f1=imread('.\images\dipum_images_ch09\Fig0914(a)(bone-skel).tif');
229 subplot(121),imshow(f1);
230 title('原始形態骨架影象');
231 
232 g1=endpoints(f1);
233 %set(gcf,'outerposition',get(0,'screensize'));%執行完後自動生成最大的視窗
234 subplot(122),imshow(g1);
235 title('骨架影象的端點影象');
236 %骨架頭像端點檢測頭像如下:
237 
238 f2=imread('.\images\dipum_images_ch09\Fig0916(a)(bone).tif');
239 figure,subplot(121),imshow(f2);
240 title('原始骨頭影象');
241 
242 g2=endpoints(f2);
243 subplot(122),imshow(g2);
244 title('骨頭影象端點頭像');%結果是沒有端點
245%骨頭頭像端點檢測影象如下:

246 
247 %% bwmorph組合常見形態學之細化
248 clc
249 clear
250 f=imread('.\images\dipum_images_ch09\Fig0911(a)(noisy-fingerprint).tif');
251 subplot(221),imshow(f);
252 title('指紋影象細化原圖');
253 
254 g1=bwmorph(f,'thin',1);
255 subplot(222),imshow(g1);
256 title('指紋影象細化原圖');
257 
258 g2=bwmorph(f,'thin',2);
259 subplot(223),imshow(g2);
260 title('指紋影象細化原圖');
261 
262 g3=bwmorph(f,'thin',Inf);
263 subplot(224),imshow(g3);
264 title('指紋影象細化原圖');
265%指紋影象細化過程顯示如下:

266 
267 %% bwmorph組合常見形態學之骨骼化
268 clc
269 clear
270 f=imread('.\images\dipum_images_ch09\Fig0911(a)(noisy-fingerprint).tif');
271 subplot(131),imshow(f);
272 title('指紋影象骨骼化原圖');
273 
274 fs=bwmorph(f,'skel',Inf);
275 subplot(132),imshow(fs);
276 title('指紋影象骨骼化');
277 
278 for k=1:5
279     fs=fs&~endpoints(fs);
280 end
281 subplot(133),imshow(fs);
282 title('指紋影象修剪後骨骼話');
283%指紋影象骨骼化過程顯示:

284 
285 %% 使用函式bwlabel標註連通分量
286 clc
287 clear
288 f=imread('.\images\dipum_images_ch09\Fig0917(a)(ten-objects).tif');
289 imshow(f),title('標註連通分量原始影象');
290%其結果顯示如下:

291 
292 [L,n]=bwlabel(f);%L為標記矩陣,n為找到連線分量的總數
293 [r,c]=find(L==3);%返回第3個物件所有畫素的行索引和列索引
294 
295 rbar=mean(r);
296 cbar=mean(c);
297 
298 figure,imshow(f)
299 hold on%保持當前影象使其不被重新整理
300 for k=1:n
301     [r,c]=find(L==k);
302     rbar=mean(r);
303     cbar=mean(c);
304     plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k',...
305          'MarkerFaceColor','k','MarkerSize',10);%這個plot函式用法不是很熟悉
306     plot(cbar,rbar,'Marker','*','MarkerFaceColor','w');%其中的marker為標記
307 end
308 title('標記所有物件質心後的影象');

309 
310 %% 由重構做開運算
311 clc
312 clear
313 f=imread('.\images\dipum_images_ch09\Fig0922(a)(book-text).tif');
314 subplot(321),imshow(f);
315 title('重構原始影象');
316 
317 fe=imerode(f,ones(51,1));%豎線腐蝕
318 subplot(322),imshow(fe);
319 title('使用豎線腐蝕後的結果');
320 
321 fo=imopen(f,ones(51,1));%豎線做開運算
322 subplot(323),imshow(fo);
323 title('使用豎線做開運算結果');
324 
325 fobr=imreconstruct(fe,f);%fe做標記
326 subplot(324),imshow(fobr);
327 title('使用豎線做重構開運算');
328 
329 ff=imfill(f,'holes');%對f進行孔洞填充
330 subplot(325),imshow(ff);
331 title('對f填充孔洞後的影象');
332 
333 fc=imclearborder(f,8);%清除邊界,2維8鄰接
334 subplot(326),imshow(fc);
335 title('對f清除邊界後的影象');
336%影象重構過程顯示如下:

337 
338 %% 使用頂帽變換和底帽變換
339 clc
340 clear
341 f=imread('.\images\dipum_images_ch09\Fig0926(a)(rice).tif');
342 subplot(221),imshow(f);
343 title('頂帽底帽變換原始影象');
344 
345 se=strel('disk',10);%產生結構元素
346 %頂帽變換是指原始影象減去其開運算的影象
347 %而開運算可用於補償不均勻的背景亮度,所以用一個大的結構元素做開運算後
348 %然後用原影象減去這個開運算,就得到了背景均衡的影象,這也叫做是影象的頂帽運算
349 f1=imtophat(f,se);%使用頂帽變換
350 subplot(222),imshow(f1);
351 title('使用頂帽變換後的影象');
352 
353 %底帽變換是原始影象減去其閉運算後的影象
354 f2=imbothat(imcomplement(f),se);%使用底帽變換,為什麼原影象要求補呢?
355 %f2=imbothat(f,se);%使用底帽變換
356 subplot(223),imshow(f2);
357 title('使用底帽變換後的影象');
358 
359 %頂帽變換和底帽變換聯合起來用,用於增加對比度
360 f3=imsubtract(imadd(f,imtophat(f,se)),imbothat(f,se));%裡面引數好像不合理?
361 subplot(224),imshow(f3);
362 title('使用頂帽底帽聯合變換後圖像');
363%頂帽底帽變換過程影象如下:

364 
365 %%使用開運算和閉運算做形態學平滑
366 %由於開運算可以除去比結構元素更小的明亮細節,閉運算可以除去比結構元素更小的暗色細節
367 %所以它們經常組合起來一起進行平滑影象並去除噪聲
368 clc
369 clear
370 f=imread('.\images\dipum_images_ch09\Fig0925(a)(dowels).tif');
371 subplot(221),imshow(f);
372 title('木釘影象原圖');
373 
374 se=strel('disk',5);%disk其實就是一個八邊形
375 fo=imopen(f,se);%經過開運算
376 subplot(222),imshow(f);
377 title('使用半徑5的disk開運算後的影象');
378 
379 foc=imclose(fo,se);
380 subplot(223),imshow(foc);
381 title('先開後閉的影象');
382 
383 fasf=f;
384 for i=2:5
385     se=strel('disk',i);
386     fasf=imclose(imopen(fasf,se),se);
387 end
388 subplot(224),imshow(fasf);
389 title('使用開閉交替濾波後圖像');
390%使用開運算和閉運算做形態學平滑結果如下:

391 
392 %% 顆粒分析
393 clc
394 clear
395 f=imread('.\images\dipum_images_ch09\Fig0925(a)(dowels).tif');
396 
397 sumpixels=zeros(1,36);
398 for k=0:35
399     se=strel('disk',k);
400     fo=imopen(f,se);
401     sumpixels(k+1)=sum(fo(:));
402 end
403 
404 %可以看到,連續開運算之間的表面積會減少
405 plot(0:35,sumpixels),xlabel('k'),ylabel('surface area');
406 title('表面積和結構元素半徑之間的關係');
407%其運算結果如下:   

408 
409 figure,plot(-diff(sumpixels));%diff()函式為差分或者近似倒數,即相鄰2個之間的差值
410 xlabel('k'),ylabel('surface area reduction');
411 title('減少的表面積和結構元素半徑之間的關係');
412%其運算結果如下:

413 
414 %% 使用重構刪除複雜影象的背景
415 clc
416 clear
417 f=imread('.\images\dipum_images_ch09\Fig0930(a)(calculator).tif');
418 subplot(221),imshow(f);
419 title('灰度級重構原影象');
420 
421 f_obr=imreconstruct(imerode(f,ones(1,71)),f);
422 subplot(222),imshow(f_obr);
423 title('經開運算重構圖');
424 
425 f_o=imopen(f,ones(1,71));
426 subplot(223),imshow(f_o);
427 title('經開運算後圖');
428 
429 f_thr=imsubtract(f,f_obr);
430 subplot(224),imshow(f_thr);
431 title('頂帽運算重構圖')
432%使用重構刪除複雜影象的背景1:

相關推薦

matlab膨脹腐蝕案例

      形態學是提取影象特徵的有力工具,針對二值影象和灰度影象的腐蝕、膨脹和重構的基本操作可以組合使用,以執行非常寬泛的任務。其練習程式碼和結果如下: 1 %% 第9章 形態學處理 2 3 %% imdilate膨脹 4 clc 5 clear 6 7 A1=imr

SpringBoot2 整合Nacos元件,環境搭建入門案例

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、Nacos基礎簡介 1、概念簡介 Nacos 是構建以“服務”為中心的現代應用架構,如微服務正規化、雲原生正規化等服務基礎設施。聚焦於發現、配置和管理微服務。Nacos提供一組簡單易用的特性集,幫助開發者快速實現動態服務發現、服務配置、服務元資料

NFS服務器原理安裝配置案例演練

隨機選擇 span 通訊 操作系統 不同 網絡 定義 重新啟動 exportfs NFS服務器原理和安裝配置詳解附案例演練 1、什麽是NFS服務器   NFS就是Network File System的縮寫,它最大的功能就是可以通過網絡,讓不同的機器、不同的操作系統可以共享

Python全棧必學知識:如何使用dictset操作方法,正確的案例

Python內建了字典:dict的支援,dict全稱dictionary,在其他語言中也稱為map,使用鍵-值(key-value)儲存,具有極快的查詢速度。 舉個例子,假設要根據同學的名字查詢對應的成績,如果用list實現,需要兩個list: names = ['Michael', 'Bob

Python如何操作使用繼承多型方法?案例

在OOP程式設計中,當我們定義一個class的時候,可以從某個現有的class繼承,新的class稱為子類(Subclass),而被繼承的class稱為基類、父類或超類(Base class、Super class)。 比如,我們已經編寫了一個名為Animal

java Hibernate一級快取二級快取概念案例

  一、一級快取二級快取的概念解釋   (1)一級快取就是Session級別的快取,一個Session做了一個查詢操作,它會把這個操作的結果放在一級快取中,如果短時間內這個   session(一定要同一個session)又做了同一個操作,那麼hibernate直接從一級快

Java Thread(執行緒)案例sleepwait的區別

使用Wait()方法輸出結果:【顯示輸出】 我們來大致分析一下此段程式碼,main()方法中例項化ThreadTest並啟動該執行緒,然後呼叫該執行緒的一個方法(secondMethod()),因為在主執行緒中呼叫方法,所以呼叫的普通方法secondMethod())會先被執行(但並不是普通方法執行完畢該物件

Scrapy 爬蟲框架入門案例

tin mon setting 爬蟲框架 finished perror project 原因 create 歡迎大家關註騰訊雲技術社區-博客園官方主頁,我們將持續在博客園為大家推薦技術精品文章哦~ 作者:崔慶才 Scrapy入門 本篇會通過介紹一

轉載 logback的使用logback.xml http://www.cnblogs.com/warking/p/5710303.html

version tor red java代碼 根節點 ext private 字符串 npe logback的使用和logback.xml詳解 一、logback的介紹  Logback是由log4j創始人設計的另一個開源日誌組件,官方網站: http://logb

微信公眾開發URLtoken填寫

res wrap this true 進行 -m tmp sem 知識 微信公眾開發URL和token填寫詳解 方法/步驟 作為一名微信公眾號開發者,別人進入你的微信公眾號,肯定會看見某些網頁,或者給你發某些信息,你需要實時自動回復,所以你

storm集群部署配置過程

多少 帶來 進程 創建 使用 命令 介紹 aml 可能 ---恢復內容開始--- 先整體介紹一下搭建storm集群的步驟: 設置zookeeper集群 安裝依賴到所有nimbus和worker節點 下載並解壓storm發布版本到所有nimbus和worker節點 配置s

接口測試工具soapUI的安裝使用方法

service 技術 key custom media 負載 bmp file text soapUI是一個開源測試工具,通過soap/http來檢查、調用、實現Web Service的功能/負載/符合性測試。 使用soapUI可以非常方便的實現接口的功能測試、穩

Sql Server參數化查詢之where inlike實現

blog charindex 語句 pan 建議 ack rop for 臨時表 文章導讀 拼SQL實現where in查詢 使用CHARINDEX或like實現where in 參數化 使用exec動態執行SQl實現where in 參數化 為每一個參數生成一個參數

MySQL存儲引擎中的MyISAMInnoDB區別

訪問 過程 包含 lte 處理機制 comm 用戶 isam log MyISAM是MySQL的默認數據庫引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的順序訪問方法)所改良。雖然性能極佳,但卻有一個缺點:不

Android Studio中GitGitHub使用

可能 必須 窗口 gin 擁有 說明 詳細 對話 發現   一、Git和GitHub簡述    1.Git    分布式版本控制系統,最先使用於Linux社區,是一個開源免費的版本控制系統,功能類似於SVN和CVS。Git與其他版本管理工具最大的區別點和優點就是分布式;  

MyISAMInnoDB區別

sam 是什麽 註意 高速 dump 在操作 必須 index 自己 MyISAM是MySQL的默認數據庫引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的順序訪問方法)所改良。雖然性能極佳,但卻有一個缺點:不

netstat Recv-QSend-Q

java ket -a ant 相關 csdn min any ber http://blog.csdn.net/sjin_1314/article/details/9853163   通過netstat -anp可以查看機器的當前連接狀態: Active Inter

js keyup、keypresskeydown事件

rgs spa 小鍵盤 ansi 使用方法 form 單個 sage ges js keyup、keypress和keydown事件都是有關於鍵盤的事件 當一個按鍵被pressed 或released在每一個現代瀏覽器中,都可能有三種客戶端事件。 keydown even

轉:logback的使用logback.xml

靈活 多說 maven path socket win error 輸出日誌 功能 一、logback的介紹  Logback是由log4j創始人設計的另一個開源日誌組件,官方網站: http://logback.qos.ch。它當前分為下面下個模塊:  logback-c

logback的使用logback.xml

ons servle home 切換 內部 實現 負責 ace acc 一、logback的介紹  Logback是由log4j創始人設計的另一個開源日誌組件,官方網站: http://logback.qos.ch。它當前分為下面下個模塊:  logback-core:其它