基于FPGA形態(tài)學(xué)開運(yùn)算、閉運(yùn)算和梯度的實(shí)現(xiàn)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
基于FPGA形態(tài)學(xué)開運(yùn)算、閉運(yùn)算和梯度的實(shí)現(xiàn)
1 概述
開運(yùn)算一般平滑物體的輪廓、斷開較窄的狹頸并消除細(xì)的突出物。閉運(yùn)算同樣也會(huì)平滑輪廓的一部分,但與開操作相反,它通常會(huì)彌合較窄的間斷和細(xì)長的溝壑,消除小的孔洞,填補(bǔ)輪廓線的中的斷裂。
形態(tài)學(xué)開運(yùn)算與閉運(yùn)算:
形態(tài)學(xué)開運(yùn)算就是先對(duì)圖像進(jìn)行腐蝕然后在膨脹,表達(dá)式即:
形態(tài)學(xué)閉運(yùn)算就是先對(duì)圖像進(jìn)行膨脹然后在腐蝕,表達(dá)式即:
圖1 開運(yùn)算和閉運(yùn)算演示(原圖由美國國家標(biāo)準(zhǔn)和技術(shù)研究所提供)
如圖1所示,a為噪聲圖像,b為結(jié)構(gòu)元,c為腐蝕后的圖像,d為A的開運(yùn)算,e為開運(yùn)算的膨脹,f為開運(yùn)算的閉運(yùn)算。f相對(duì)于a經(jīng)過了一系列的形態(tài)學(xué)運(yùn)算之后紋理變得更加清晰,只為后期的指紋識(shí)別打下基礎(chǔ)。
膨脹和腐蝕可與圖像相減結(jié)合起來得到一幅圖像的形態(tài)學(xué)梯度。
形態(tài)學(xué)梯度:
灰度圖像的膨脹減去灰度圖像的腐蝕就是形態(tài)學(xué)梯度,表達(dá)式:
圖2 CT掃描頭部圖像
如圖2所示,a為頭部CT掃描圖像,b為膨脹后的結(jié)果,c為腐蝕后的結(jié)果,d為形態(tài)學(xué)梯度。計(jì)算圖b與圖c的差得到圖d,圖d顯示出了區(qū)域間的邊界被清楚地描繪出來。這與二維微分圖像的預(yù)期結(jié)果相同。
2 matlab實(shí)現(xiàn)
基于matlab的形態(tài)學(xué)開運(yùn)算以及閉運(yùn)算源碼:
%% image open close
clear all
img_a = imread('flower.bmp');
figure,imshow(img_a);
title('rgb');
img_b = rgb2gray(img_a);
figure,imshow(img_b);
title('gray');
a = [1,1,1;
1,1,1;
1,1,1];
img_c = imopen(img_b,a);
figure,imshow(img_c);
title('open');
img_d = imclose(img_b,a);
figure,imshow(img_d);
title('close');
圖3 實(shí)驗(yàn)原圖
圖4 灰度圖像
圖5 開運(yùn)算的結(jié)果
圖6 閉運(yùn)算的結(jié)果
基于matlab的形態(tài)學(xué)梯度源碼:
%%gradient
clear all
img_a = imread('flower.bmp');
figure,imshow(img_a);
title('rgb');
img_b = rgb2gray(img_a);
figure,imshow(img_b);
title('gray');
a = [1,1,1;
1,1,1;
1,1,1];
img_c = imerode(img_b, a);
figure,imshow(img_c);
title('erode');
img_d = imdilate(img_b, a);
figure,imshow(img_d);
title('dilate');
img_e = img_d -img_c;
figure,imshow(img_e);
title('gradient');
img_f = img_b -img_c;
figure,imshow(img_f);
title('gradient1');
img_g = img_d -img_b;
figure,imshow(img_g);
title('gradient2');
圖7 梯度0
圖8 梯度1
圖9 梯度2
3 FPGA實(shí)現(xiàn)
圖10 為整個(gè)設(shè)計(jì)的RTL級(jí)電路圖
形態(tài)學(xué)開運(yùn)算源碼:
//--------------------------------
// open
//--------------------------------
erode erode_inst(
.clk(TFT_clk),
.rst_n(Rst_n),
.hs_in(o_hs),
.vs_in(o_vs),
.din(o_y_8b),
.din_valid(o_de),
.dout(erode_out),
.dout_valid(erode_de),
.hs_out(erode_hs),
.vs_out(erode_vs)
);
dilate dilate_inst(
.clk(TFT_clk),
.rst_n(Rst_n),
.hs_in(erode_hs),
.vs_in(erode_vs),
.din(erode_out),
.din_valid(erode_de),
.dout(dilate_out),
.dout_valid(TFT_de),
.hs_out(TFT_hs),
.vs_out(TFT_vs)
);
assign TFT_rgb = {dilate_out[7:3],dilate_out[7:2],dilate_out[7:3]}; //Y
結(jié)果:
圖11 FPGA開運(yùn)算效果
形態(tài)學(xué)閉運(yùn)算源碼:
//--------------------------------
// close
//--------------------------------
dilate dilate_inst(
.clk(TFT_clk),
.rst_n(Rst_n),
.hs_in(o_hs),
.vs_in(o_vs),
.din(o_y_8b),
.din_valid(o_de),
.dout(dilate_out),
.dout_valid(dilate_de),
.hs_out(dilate_hs),
.vs_out(dilate_vs)
);
erode erode_inst(
.clk(TFT_clk),
.rst_n(Rst_n),
.hs_in(dilate_hs),
.vs_in(dilate_vs),
.din(dilate_out),
.din_valid(dilate_de),
.dout(erode_out),
.dout_valid(TFT_de),
.hs_out(TFT_hs),
.vs_out(TFT_vs)
);
assign TFT_rgb = {erode_out[7:3],erode_out[7:2],erode_out[7:3]}; //Y
結(jié)果:
圖12 FPGA閉運(yùn)算效果
形態(tài)學(xué)梯度源碼:
//---------------------------------------------
//Morphological gradient.
//---------------------------------------------
erode erode_inst(
.clk(TFT_clk),
.rst_n(Rst_n),
.hs_in(o_hs),
.vs_in(o_vs),
.din(o_y_8b),
.din_valid(o_de),
.dout(erode_out),
.dout_valid(TFT_de),
.hs_out(TFT_hs),
.vs_out(TFT_vs)
);
dilate dilate_inst(
.clk(TFT_clk),
.rst_n(Rst_n),
.hs_in(o_hs),
.vs_in(o_vs),
.din(o_y_8b),
.din_valid(o_de),
.dout(dilate_out),
.dout_valid(),
.hs_out(),
.vs_out()
);
assign dout = dilate_out - erode_out;
assign TFT_rgb = {dout[7:3],dout[7:2],dout[7:3]}; //Y
//assign TFT_rgb = {o_y_8b[7:3],o_y_8b[7:2],o_y_8b[7:3]}; //Y
結(jié)果:
圖13 FPGA形態(tài)學(xué)梯度效果
總結(jié):
迄今為止許多形態(tài)學(xué)的技術(shù)都是以灰度級(jí)形態(tài)學(xué)概念為基礎(chǔ)。這包括形態(tài)學(xué)平滑、形態(tài)學(xué)梯度、頂帽變換、底帽變換、粒度測(cè)定和紋理分割等。