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:

433 
434 f_th=imsubtract(f,f_o)
435 figure,subplot(221),imshow(f_th);
436 title('經頂帽運算圖');
437 
438 g_obr=imreconstruct(imerode(f_thr,ones(1,11)),f_thr);

            
           

相關推薦

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=imfinf

OpenCV學習筆記-形態學操作-腐蝕膨脹-運算

一個可以調節引數的形態學例題,用到的自定義核函式為:IplConvKernel * cvCreateStructuringElementEx( int cols, int rows, int anchor_x, int anchor_y, int shape, int *va

【cv筆記】卷積 + 數學形態學膨脹腐蝕運算等)

一 卷積 1 卷積定義 卷積是兩個變數在某範圍內相乘後求和的結果。如果卷積的變數是序列x(n)和h(n),則卷積的結果 y(n)=∑i=−∞∞x(i)h(n−i)=x(n)∗h(n)y(n)=∑i=−∞∞x(i)h(n−i)=x(n)∗h(n)

OpenCV膨脹腐蝕運算

腐蝕和膨脹是最基本的形態學運算。 腐蝕和膨脹是針對白色部分(高亮部分)而言的。 膨脹就是對影象高亮部分進行“領域擴張”,效果圖擁有比原圖更大的高亮區域;腐蝕是原圖中的高亮區域被蠶食,效果圖擁有比原圖更小的高亮區域。 膨脹 膨脹就是求區域性最大值的操作,從影象直觀看來,

Python OpenCV _3形態學處理腐蝕膨脹運算,以及利用形態學進行邊緣角點檢測)

Python OpenCV這個初級影象處理系列是參考他人的文章寫的,有些地方做了一些改動,沒有太多理論,側重程式碼實現,主要目的是將這些基本操作程式碼系統地梳理一遍,也是為了以後能快速查詢。 此係列原始碼在我的GitHub裡:https://github.com/yeyujujishou19/P

OpenCV計算機視覺學習(5)——形態學處理腐蝕膨脹運算,禮帽黑帽,邊緣檢測)

如果需要處理的原圖及程式碼,請移步小編的GitHub地址   傳送門:請點選我   如果點選有誤:https://github.com/LeBron-Jian/ComputerVisionPractice   形態學操作簡單來說,就是改變物體的形狀,下面學習一下,首先本文的目錄如下: 1,定義結構元素 2,

Python 影象處理 OpenCV (9):影象處理形態學運算運算以及梯度運算

![](https://cdn.geekdigging.com/opencv/opencv_header.png) 前文傳送門: [「Python 影象處理 OpenCV (1):入門」](https://www.geekdigging.com/2020/05/17/5513454552/) [「Pyt

opencv腐蝕膨脹運算

腐蝕和膨脹是最基本的形態學運算。 腐蝕和膨脹是針對白色部分(高亮部分)而言的。 膨脹就是對影象高亮部分進行“領域擴張”,效果圖擁有比原圖更大的高亮區域;腐蝕是原圖中的高亮區域被蠶食,效果圖擁有比原圖更小的高亮區域。 膨脹就是求區域性最大值的操作,從影象直觀看來,就是將影象光亮部分放大,

影象處理--形態學 top Hat - black Hat

膨脹(dilate) 腐蝕(erode) 開運算(opening Operation)           開運算其實就是先腐蝕再膨脹 閉運算(closing Operation)       &nb

影象處理 形態學操作

基本的運算包括:二值腐蝕和膨脹、二值開閉運算、骨架抽取、極限腐蝕、擊中擊不中變換、形態學梯度、Top-hat變換、顆粒分析、流域變換、灰值腐蝕和膨脹、灰值開閉運算、灰值形態學梯度等。 注意:腐蝕和膨脹是對白色部分(高亮部分)而言的,不是黑色部分。膨脹就是影象中的高亮部分進行膨脹,“領域擴張”,效果

數字影象處理——形態學處理

形態學處理:利用數學形態學作為工具從影象中提取對於表達和描述區域形狀有用的影象分量。 數學形態學的語言:二值影象的集合論。顯示時黑色表示為1,白色表示為0! 基本處理: 1.擴張/膨脹dilation 將模板中心(結構原點)對準待處理畫素,逐點掃描模板下的畫素,如果模板中的畫素有一點

Matlab 影象處理 筆記

批量儲存視訊每一幀影象:  video = VideoReader('realSample.avi'); % 讀取視訊檔案 nFrames = video.NumberOfFrames;   %得到幀

Matlab影象處理常用函式

目錄 一、Matlab常用的統計函式 求和 sum(X) 最小值 min(X) 均值 mean(X) 最大值 max(X) x的平方根

影象運算

二值影象腐蝕函式 [演算法說明]   二值影象腐蝕操作屬於影象形態學的範疇,形態學運算是隻針對二值影象進行,並依據數學形態學(Mathermatical Morphogy)集合論方法發展起來的數字影象處理方法,它主要包括腐蝕,膨脹,開,閉,擊中,擊不中等。   

MATLAB影象處理_同態濾波1

原 MATLAB影象處理_同態濾波 2015年01月20日 09:54:25 風雨也無晴 閱讀數:14234 同態濾

Matlab影象處理-亮度(灰度)變換問題

亮度(灰度)變換是一種非常重要的空間域內處理影象的方法,主要介紹幾個亮度變換函式,以及應用。 函式簡介 1.imadjust 該函式用來調整亮度,可以對映加權至更高的或更低輸出值。 imadjust是亮度變換的基本IPT工具,語法為: g

MATLAB影象處理imadjust()函式調節影象的對比度示例

imadjust()函式J=imadjust(I)  將強度影象為I的值對映到J中的新值,使得1%的資料在低強度和高強度I時飽和。這將增加了輸出影象J的對比度。J = imadjust(I,[LOW_IN; HIGH_IN],[LOW_OUT; HIGH_OUT])將強度影象

基於MATLAB影象處理的中值濾波、均值濾波以及高斯濾波的實現與對比

基於MATLAB影象處理的中值濾波、均值濾波以及高斯濾波的實現與對比 作者:lee神 1.背景知識 中值濾波法是一種非線性平滑技術,它將每一畫素點的灰度值設定為該點某鄰域視窗內的所有畫素點灰度值的中值. 中值濾波是基於排序統計理論的一種能有效抑制噪聲的非線性訊號處

MATLAB影象處理_直接操作畫素點進行顏色變換

需求 直接操作RGB影象的畫素點,進行顏色的相關操作。            掌握這個,必須對MATLAB中矩陣的操作有所熟悉,特別是整行、整列的操作。      如:            J =

Matlab影象處理轉灰度圖,繪製直方圖,直方圖均衡化

1.imread() MATLAB中影象讀取函式與OpenCV一樣是imread,可以開啟指定路徑圖片,其路徑表示方式與OpenCV中有些許不同如: srcImage=imread('E:\MatlabWorkSpace\實驗一\實驗一圖一.png'); 路徑符號為單"\"