基于FPGA形態(tài)學開運算、閉運算和梯度的實現(xiàn)
掃描二維碼
隨時隨地手機看文章
基于FPGA形態(tài)學開運算、閉運算和梯度的實現(xiàn)
1 概述
開運算一般平滑物體的輪廓、斷開較窄的狹頸并消除細的突出物。閉運算同樣也會平滑輪廓的一部分,但與開操作相反,它通常會彌合較窄的間斷和細長的溝壑,消除小的孔洞,填補輪廓線的中的斷裂。
形態(tài)學開運算與閉運算:
形態(tài)學開運算就是先對圖像進行腐蝕然后在膨脹,表達式即:
形態(tài)學閉運算就是先對圖像進行膨脹然后在腐蝕,表達式即:
圖1 開運算和閉運算演示(原圖由美國國家標準和技術(shù)研究所提供)
如圖1所示,a為噪聲圖像,b為結(jié)構(gòu)元,c為腐蝕后的圖像,d為A的開運算,e為開運算的膨脹,f為開運算的閉運算。f相對于a經(jīng)過了一系列的形態(tài)學運算之后紋理變得更加清晰,只為后期的指紋識別打下基礎。
膨脹和腐蝕可與圖像相減結(jié)合起來得到一幅圖像的形態(tài)學梯度。
形態(tài)學梯度:
灰度圖像的膨脹減去灰度圖像的腐蝕就是形態(tài)學梯度,表達式:
圖2 CT掃描頭部圖像
如圖2所示,a為頭部CT掃描圖像,b為膨脹后的結(jié)果,c為腐蝕后的結(jié)果,d為形態(tài)學梯度。計算圖b與圖c的差得到圖d,圖d顯示出了區(qū)域間的邊界被清楚地描繪出來。這與二維微分圖像的預期結(jié)果相同。
2 matlab實現(xiàn)
基于matlab的形態(tài)學開運算以及閉運算源碼:
%% 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 實驗原圖
圖4 灰度圖像
圖5 開運算的結(jié)果
圖6 閉運算的結(jié)果
基于matlab的形態(tài)學梯度源碼:
%%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實現(xiàn)
圖10 為整個設計的RTL級電路圖
形態(tài)學開運算源碼:
//--------------------------------
// 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開運算效果
形態(tài)學閉運算源碼:
//--------------------------------
// 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閉運算效果
形態(tài)學梯度源碼:
//---------------------------------------------
//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)學梯度效果
總結(jié):
迄今為止許多形態(tài)學的技術(shù)都是以灰度級形態(tài)學概念為基礎。這包括形態(tài)學平滑、形態(tài)學梯度、頂帽變換、底帽變換、粒度測定和紋理分割等。