0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

介紹MATLAB一種算法實現(xiàn)方式

電子工程師 ? 來源:未知 ? 作者:劉勇 ? 2018-08-27 10:32 ? 次閱讀

本篇文章要分享的是基于MATLAB的腐蝕膨脹算法實現(xiàn),腐蝕膨脹是形態(tài)學圖像處理的基礎(chǔ),腐蝕在二值圖像的基礎(chǔ)上做“收縮”或“細化”操作,膨脹在二值圖像的基礎(chǔ)上做“加長”或“變粗”的操作。

什么是二值圖像呢?把一幅圖片看做成一個二維的數(shù)組,那么二值圖像是一個只有0和1的邏輯數(shù)組,我們前面Sobel邊緣檢測后的圖像輸出邊緣效果,設(shè)置個閾值,大于閾值輸出為1,小于閾值輸出為0,最后輸出就是一幅二值圖像了。

腐蝕

腐蝕是一種消除邊界點,使邊界向內(nèi)部收縮的過程??梢杂脕硐∏覠o意義的物體。用3X3的結(jié)構(gòu)元素,掃描圖像的每一個像素,用結(jié)構(gòu)元素與其覆蓋的二值圖像做“與”操作,如果都為1,結(jié)果圖像的該像素為1。否則為0。結(jié)果會使二值圖像小一圈。

有一個形象的比喻來可以說明該運算,用0表示蛀蟲,1表示大米。蛀蟲腐蝕大米的過程便是腐蝕運算,

腐蝕

如圖所示,對于一個像素矩陣而言,只要有蛀蟲(0)的存在,大米(1)就會被腐蝕掉了,即使只存在一個蛀蟲(0),但是還是會被蛀蟲腐蝕完畢,最后一幅圖上面由于沒有蛀蟲(0)所以大米完好無損。

關(guān)于算法的實現(xiàn),可以用下式子來表示,即3x3像素的運算:

P = P11 & P12 & P13 & P21 & P22 & P23 & P31 & P32 & P33

FPGA中,為了通過面積去換速度,我們將上式改變?nèi)缦拢?/p>

P1 = P11 & P12 & P13

P2 = P21 & P22 & P23

P3 = P31 & P32 & P33

P = P1 & P2 & P3

MATLAB中可以直接寫一個按位或運算。

膨脹

膨脹是將與物體接觸的所有背景點合并到該物體中,使邊界向外部擴張的過程??梢杂脕硖钛a物體中的空洞。用3X3的結(jié)構(gòu)元素,掃描圖像的每一個像素,用結(jié)構(gòu)元素與其覆蓋的二值圖像做“與”操作,如果都為0,結(jié)果圖像的該像素為0,。否則為1。結(jié)果使二值圖像擴大一圈。

先腐蝕后膨脹的過程稱為開運算。用來消除小物體、在纖細點處分離物體、平滑較大物體的邊界的同時并不明顯的改變其面積。先膨脹后腐蝕的過程稱為比運算,用來填充物體內(nèi)細小空間、連接鄰近物體、平滑其邊界的同時并不明顯改變其面積。

膨脹算法用最簡單的比喻來描述:0表示害蟲,1表示青蛙,青蛙吃了害蟲表示膨脹運算,我們用3*3像素陣列來解釋:

膨脹

如圖所示,圖左只有害蟲(0),所以害蟲都活著,中間那個圖,雖然只有一個害蟲,但是還是會被青蛙全部吃掉,最右邊的那幅圖,都是青蛙,所以青蛙始終是青蛙。

關(guān)于算法的實現(xiàn),可以用下式子來表示,即3x3像素的運算:

P = P11 | P12 | P13 | P21 | P22 | P23 | P31 | P32 | P33

在HDL中,為了通過面積去換速度,我們將上式改變?nèi)缦拢?/p>

P1 = P11 | P12 | P13

P2 = P21 | P22 | P23

P3 = P31 | P32 | P33

P = P1 | P2 | P3

MATLAB中可以直接寫一個按位與運算。

開運算閉運算

先腐蝕后膨脹叫開運算,開運算的作用是清除圖像邊緣周圍非邊緣的細小的點。先膨脹后腐蝕為閉運算,閉運算的作用是清除圖像內(nèi)部的空洞,

如果我們的目標物體外面有很多無關(guān)的小區(qū)域,就用開運算去除掉;如果物體內(nèi)部有很多小黑洞,就用閉運算填充掉。

MATLAB邏輯運算函數(shù)

bitand(), 對十進制數(shù)進行逐位邏輯與運算:先將十進制數(shù)轉(zhuǎn)換成二進制數(shù),然后逐位與運算,其運算結(jié)果轉(zhuǎn)換為十進制。

bitor(), 對十進制數(shù)進行逐位邏輯或運算:先將十進制數(shù)轉(zhuǎn)換成二進制數(shù),然后逐位與運算,其運算結(jié)果轉(zhuǎn)換為十進制。

MATLAB代碼實現(xiàn)

1 %RGB_YCbCr  2 clc;  3 clear all;  4 close all;  5   6 RGB_data = imread('lena.jpg');  7   8 R_data =  RGB_data(:,:,1);  9 G_data =  RGB_data(:,:,2);  10 B_data =  RGB_data(:,:,3);  11   12 %imshow(RGB_data);  13   14 [ROW,COL, DIM] = size(RGB_data); 
 15   16 Y_data = zeros(ROW,COL);  17 Cb_data = zeros(ROW,COL);  18 Cr_data = zeros(ROW,COL);  19 Gray_data = RGB_data;  20   21 for r = 1:ROW 
 22   for c = 1:COL  23     Y_data(r, c) = 0.299*R_data(r, c) + 0.587*G_data(r, c) + 0.114*B_data(r, c);  24     Cb_data(r, c) = -0.172*R_data(r, c) - 0.339*G_data(r, c) + 0.511*B_data(r, c) + 128;  25     Cr_data(r, c) = 0.511*R_data(r, c) - 0.428*G_data(r, c) - 0.083*B_data(r, c) + 128;  26   end  27 end 
 28   29 Gray_data(:,:,1)=Y_data;  30 Gray_data(:,:,2)=Y_data;  31 Gray_data(:,:,3)=Y_data;  32   33 figure;  34 imshow(Gray_data);  35   36 %Median Filter  37 imgn = imnoise(Gray_data,'salt & pepper',0.02); 
 38   39 figure;  40 imshow(imgn);  41   42 Median_Img = Gray_data;  43 for r = 2:ROW-1  44   for c = 2:COL-1  45     median3x3 =[imgn(r-1,c-1)  imgn(r-1,c) imgn(r-1,c+1)  46           imgn(r,c-1)   imgn(r,c)   imgn(r,c+1)  47           imgn(r+1,c-1)   imgn(r+1,c) imgn(r+1,c+1)];  48     sort1 = sort(median3x3, 2, 'descend'); 49     sort2 = sort([sort1(1), sort1(4), sort1(7)], 'descend');  50     sort3 = sort([sort1(2), sort1(5), sort1(8)], 'descend');  51     sort4 = sort([sort1(3), sort1(6), sort1(9)], 'descend');  52     mid_num = sort([sort2(3), sort3(2), sort4(1)], 'descend');  53     Median_Img(r,c) = mid_num(2);  54   end  55 end  56   57 figure;  58 imshow(Median_Img);  59   60 %Sobel_Edge_Detect  61   62 Median_Img = double(Median_Img);  63 Sobel_Threshold = 150;  64 Sobel_Img = zeros(ROW,COL);  65   66 for r = 2:ROW-1  67   for c = 2:COL-1  68     Sobel_x = Median_Img(r-1,c+1) + 2*Median_Img(r,c+1) + Median_Img(r+1,c+1) - Median_Img(r-1,c-1) - 2*Median_Img(r,c-1) - Median_Img(r+1,c-1);  69     Sobel_y = Median_Img(r-1,c-1) + 2*Median_Img(r-1,c) + Median_Img(r-1,c+1) - Median_Img(r+1,c-1) - 2*Median_Img(r+1,c) - Median_Img(r+1,c+1);  70     Sobel_Num = abs(Sobel_x) + abs(Sobel_y);  71     %Sobel_Num = sqrt(Sobel_x^2 + Sobel_y^2);  72     if(Sobel_Num > Sobel_Threshold)  73       Sobel_Img(r,c)=255;  74     else  75       Sobel_Img(r,c)=0;  76     end  77   end  78 end  79   80 figure;  81 imshow(Sobel_Img);  82   83 %imopen Erosion_Dilation  84 %Erosion  85 % Erosion_img = zeros(ROW,COL);  86 % for r = 2:ROW-1  87   % for c = 2:COL-1  88     % and1 = bitand(Sobel_Img(r-1, c-1), bitand(Sobel_Img(r-1, c), Sobel_Img(r-1, c+1)));  89     % and2 = bitand(Sobel_Img(r, c-1), bitand(Sobel_Img(r, c), Sobel_Img(r, c+1)));  90     % and3 = bitand(Sobel_Img(r+1, c-1), bitand(Sobel_Img(r+1, c), Sobel_Img(r+1, c+1)));  91     % Erosion_img(r, c) = bitand(and1, bitand(and2, and3));  92   % end  93 % end  94   95 % figure;  96 % imshow(Erosion_img);  97   98 % %Dilation  99 % Dilation_img = zeros(ROW,COL);100 % for r = 2:ROW-1101   % for c = 2:COL-1102     % or1 = bitor(Erosion_img(r-1, c-1), bitor(Erosion_img(r-1, c), Erosion_img(r-1, c+1)));103     % or2 = bitor(Erosion_img(r, c-1), bitor(Erosion_img(r, c), Erosion_img(r, c+1)));104     % or3 = bitor(Erosion_img(r+1, c-1), bitor(Erosion_img(r+1, c), Erosion_img(r+1, c+1)));105     % Dilation_img(r, c) = bitor(or1, bitor(or2, or3));106   % end107 % end108 109 % figure;110 % imshow(Dilation_img);111 112 %imclose Erosion_Dilation113 %Dilation114 Dilation_img = zeros(ROW,COL);115 for r = 2:ROW-1116   for c = 2:COL-1117     or1 = bitor(Sobel_Img(r-1, c-1), bitor(Sobel_Img(r-1, c), Sobel_Img(r-1, c+1)));118     or2 = bitor(Sobel_Img(r, c-1), bitor(Sobel_Img(r, c), Sobel_Img(r, c+1)));119     or3 = bitor(Sobel_Img(r+1, c-1), bitor(Sobel_Img(r+1, c), Sobel_Img(r+1, c+1)));120     Dilation_img(r, c) = bitor(or1, bitor(or2, or3));121   end122 end123 124 figure;125 imshow(Dilation_img);126 127 %Erosion128 Erosion_img = zeros(ROW,COL);129 for r = 2:ROW-1130   for c = 2:COL-1131     and1 = bitand(Dilation_img(r-1, c-1), bitand(Dilation_img(r-1, c), Dilation_img(r-1, c+1)));132     and2 = bitand(Dilation_img(r, c-1), bitand(Dilation_img(r, c), Dilation_img(r, c+1)));133     and3 = bitand(Dilation_img(r+1, c-1), bitand(Dilation_img(r+1, c), Dilation_img(r+1, c+1)));134     Erosion_img(r, c) = bitand(and1, bitand(and2, and3));135   end136 end137 138 figure;139 imshow(Erosion_img);

處理后結(jié)果對比

為了可以清晰的看到圖像邊緣的變化,我們把黑色作為背景,白色作為邊緣。

Sobel邊緣檢測后的lena

腐蝕后的lena

膨脹后的lena

先腐蝕后膨脹開運算lena

先膨脹后腐蝕閉運算lena

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • matlab
    +關(guān)注

    關(guān)注

    180

    文章

    2957

    瀏覽量

    229897

原文標題:基于MATLAB的腐蝕膨脹算法實現(xiàn)

文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    FFT 算法一種 FPGA 實現(xiàn)

    本帖最后由 lee_st 于 2017-11-22 08:28 編輯 摘 要: FFT 運算在OFDM 系統(tǒng)中起調(diào)制和解調(diào)的作用。針對OFDM 系統(tǒng)中FFT 運算的要求, 研究了一種易于
    發(fā)表于 11-21 15:55

    一種基于FPGA的實時視頻圖像處理算法研究與實現(xiàn)

    摘要為有效提高視頻監(jiān)控應(yīng)用領(lǐng)域中多屏幕畫面顯示的清晰度、分辨度等問題,提出了一種基于FPGA的實時視頻圖像處理算法。文中介紹了系統(tǒng)的整體結(jié)構(gòu),然后針對FPGA模塊介紹了視頻圖像的緩存及
    發(fā)表于 06-28 07:06

    介紹一種防止相位假信號的具體算法

    什么是S參數(shù)測量?S參數(shù)插補算法是什么?介紹一種防止級聯(lián)的S參數(shù)出現(xiàn)相位假信號的具體算法
    發(fā)表于 04-30 07:00

    介紹一種基于Winpcap的網(wǎng)絡(luò)視頻流識別算法

    本文設(shè)計了一種基于Winpcap的網(wǎng)絡(luò)視頻流識別算法,實現(xiàn)了對網(wǎng)絡(luò)流媒體的發(fā)現(xiàn)。
    發(fā)表于 06-03 06:34

    如何去實現(xiàn)一種錯誤控制編碼的算法?

    什么是錯誤控制編碼?如何去實現(xiàn)一種錯誤控制編碼的算法?什么是解碼算法?
    發(fā)表于 06-21 08:13

    如何去實現(xiàn)一種方波控制算法

    無刷直流電機可分為哪幾種?什么是方波控制?如何去實現(xiàn)一種方波控制算法?有哪些步驟?
    發(fā)表于 08-10 07:14

    果蠅優(yōu)化算法MATLAB實現(xiàn)

    果蠅優(yōu)化算法MATLAB實現(xiàn)發(fā)布時間:2018-10-12 23:28,瀏覽次數(shù):1183, 標簽:MATLAB果蠅優(yōu)化算法--
    發(fā)表于 08-17 07:28

    一種解決函數(shù)優(yōu)化問題的免疫算法

    一種解決函數(shù)優(yōu)化問題的免疫算法:介紹了免疫算法的基本概念,以及人工免疫系統(tǒng)中的克隆選擇原理,基于該原理,結(jié)合遺傳策略中的高斯變異算子,提出一種
    發(fā)表于 11-08 16:47 ?14次下載

    一種多核混合分區(qū)調(diào)度算法設(shè)計與實現(xiàn)

    一種多核混合分區(qū)調(diào)度算法設(shè)計與實現(xiàn)_郝繼鋒
    發(fā)表于 01-07 19:00 ?1次下載

    BP算法及其matlab實現(xiàn)

    高級自動控制算法:BP算法及其matlab實現(xiàn)
    發(fā)表于 12-02 11:45 ?2次下載

    Matlab關(guān)于Apriori算法設(shè)計

    本文詳細介紹Matlab關(guān)于Apriori算法設(shè)計。Apriori算法一種最有影響的挖掘布爾關(guān)聯(lián)規(guī)則頻繁項集的
    發(fā)表于 02-02 16:20 ?5088次閱讀
    <b class='flag-5'>Matlab</b>關(guān)于Apriori<b class='flag-5'>算法</b>設(shè)計

    如何實現(xiàn)一種改進的Bayer圖像彩色恢復(fù)差值算法

    傳感器采集到的都是經(jīng)過濾波鏡·片后的Bayer格式馬賽克圖像,為了恢復(fù)丟失掉的色彩信息,必須經(jīng)過插值計算。針對圖像采集系統(tǒng)處理的實時性要求,結(jié)合自適應(yīng)插值法和三角函數(shù)法則,提出了一種適用于硬件實現(xiàn)
    發(fā)表于 04-02 09:33 ?8次下載

    文詳解限流算法實現(xiàn)方式

    不依賴外部庫的情況下,限流算法有什么實現(xiàn)的思路?本文介紹了3實現(xiàn)限流的方式。
    的頭像 發(fā)表于 05-25 12:00 ?1356次閱讀

    MATLAB/simulink中建模時的兩不同實現(xiàn)方式

    導(dǎo)讀:本期文章主要介紹MATLAB/simulink中建模時的兩不同實現(xiàn)方式,一種是直接用現(xiàn)
    的頭像 發(fā)表于 09-15 10:07 ?1788次閱讀

    MATLAB/simulink中兩實現(xiàn)建模方式的優(yōu)勢

    導(dǎo)讀:本期文章主要介紹MATLAB/simulink中建模時的兩不同實現(xiàn)方式,一種是直接用現(xiàn)
    的頭像 發(fā)表于 09-15 10:10 ?4845次閱讀