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 11 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的平坦型圓盤結構元素 38A2=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全棧必學知識:如何使用dict和set操作方法,正確的案例詳解!
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(執行緒)案例詳解sleep和wait的區別
使用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
微信公眾開發URL和token填寫詳解
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 in和like實現詳解
blog charindex 語句 pan 建議 ack rop for 臨時表 文章導讀 拼SQL實現where in查詢 使用CHARINDEX或like實現where in 參數化 使用exec動態執行SQl實現where in 參數化 為每一個參數生成一個參數
MySQL存儲引擎中的MyISAM和InnoDB區別詳解
訪問 過程 包含 lte 處理機制 comm 用戶 isam log MyISAM是MySQL的默認數據庫引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的順序訪問方法)所改良。雖然性能極佳,但卻有一個缺點:不
Android Studio中Git和GitHub使用詳解
可能 必須 窗口 gin 擁有 說明 詳細 對話 發現 一、Git和GitHub簡述 1.Git 分布式版本控制系統,最先使用於Linux社區,是一個開源免費的版本控制系統,功能類似於SVN和CVS。Git與其他版本管理工具最大的區別點和優點就是分布式;
MyISAM和InnoDB區別詳解
sam 是什麽 註意 高速 dump 在操作 必須 index 自己 MyISAM是MySQL的默認數據庫引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的順序訪問方法)所改良。雖然性能極佳,但卻有一個缺點:不
netstat Recv-Q和Send-Q詳解
java ket -a ant 相關 csdn min any ber http://blog.csdn.net/sjin_1314/article/details/9853163 通過netstat -anp可以查看機器的當前連接狀態: Active Inter
js keyup、keypress和keydown事件 詳解
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:其它