www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > > FPGA開源工作室

基于FPGA的二值圖像的腐蝕算法的實(shí)現(xiàn)

九層之臺,起于累土

1 背景知識

腐蝕和膨脹是形態(tài)學(xué)處理的基礎(chǔ),許多形態(tài)學(xué)算法都是以這兩種操作作為基礎(chǔ)的。

1 使用腐蝕去除圖像中的部件

1 a一幅大小為486x486的連線模板二值圖像,圖1b~d分別使用11x11,15X1545X45的模板進(jìn)行腐蝕。我們從這個(gè)例子看到,腐蝕縮小或細(xì)化了二值圖像中的物體。事實(shí)上,我們可以將腐蝕看成是形態(tài)學(xué)濾波操作,這種操作將小于模板的圖像細(xì)節(jié)從圖像中濾除。

2 腐蝕算法

使用白色腐蝕:

2 腐蝕演示

在二值圖像的腐蝕算法過程中我們使用二值圖像3x3圖像矩陣,由圖2可知,當(dāng)九個(gè)格子中不全為‘0’或者‘1’時(shí),經(jīng)過腐蝕算法后九個(gè)格子的值最終都會(huì)變成‘1’;如果九個(gè)全是‘1’或者‘0’時(shí),那么最終的結(jié)果九個(gè)全是‘1’或者‘0’。

3 FPGA腐蝕算法實(shí)現(xiàn)

3 二值圖像腐蝕FPGA模塊架構(gòu)

3中我們使用串口傳圖,傳入的是二值圖像。

FPGA源碼:

/*

Module name:  binary_image_etch.v

Description:  binary image etch

*/

`timescale 1ns/1ps

module binary_image_etch(

input             clk, //pixel clk

input             rst_n,

input             hs_in,

input             vs_in,

input [15:0]      data_in,

input             data_in_en,

output            hs_out,

output            vs_out,

output  reg [15:0]    data_out,

output            data_out_en

);

wire [15:0] line0;

wire [15:0] line1;

wire [15:0] line2;

reg [15:0] line0_data0;

reg [15:0] line0_data1;

reg [15:0] line0_data2;

reg [15:0] line1_data0;

reg [15:0] line1_data1;

reg [15:0] line1_data2;

reg [15:0] line2_data0;

reg [15:0] line2_data1;

reg [15:0] line2_data2;

reg        data_out_en0;

reg        data_out_en1;

reg        data_out_en2;

reg        hs_r0;

reg        hs_r1;

reg        hs_r2;

reg        vs_r0;

reg        vs_r1;

reg        vs_r2;

wire[18:0]  result_data;

line3x3 line3x3_inst(

.clken(data_in_en),

.clock(clk),

.shiftin(data_in),

.shiftout(),

.taps0x(line0),

.taps1x(line1),

.taps2x(line2)

);

//----------------------------------------------------------------------

// Form an image matrix of three multiplied by three

//----------------------------------------------------------------------

always @(posedge clk or negedge rst_n) begin

if(!rst_n) begin

line0_data0 <= 16'b0;

line0_data1 <= 16'b0;

line0_data2 <= 16'b0;

line1_data0 <= 16'b0;

line1_data1 <= 16'b0;

line1_data2 <= 16'b0;

line2_data0 <= 16'b0;

line2_data1 <= 16'b0;

line2_data2 <= 16'b0;

data_out_en0 <= 1'b0;

data_out_en1 <= 1'b0;

data_out_en2 <= 1'b0;

hs_r0 <= 1'b0;

hs_r1 <= 1'b0;

hs_r2 <= 1'b0;

vs_r0 <= 1'b0;

vs_r1 <= 1'b0;

vs_r2 <= 1'b0;

end

else if(data_in_en) begin

line0_data0 <= line0;

line0_data1 <= line0_data0;

line0_data2 <= line0_data1;

line1_data0 <= line1;

line1_data1 <= line1_data0;

line1_data2 <= line1_data1;

line2_data0 <= line2;

line2_data1 <= line2_data0;

line2_data2 <= line2_data1;

data_out_en0 <= data_in_en;

data_out_en1 <= data_out_en0;

data_out_en2 <= data_out_en1;

hs_r0 <= hs_in;

hs_r1 <= hs_r0;

hs_r2 <= hs_r1;

vs_r0 <= vs_in;

vs_r1 <= vs_r0;

vs_r2 <= vs_r1;

end

end

//-----------------------------------------------------------------

// line0_data0   line0_data1   line0_data2

// line1_data0   line1_data1   line1_data2

// line2_data0   line2_data1   line2_data2

//----------------------------------------------------------------

/*

always @(posedge clk or negedge rst_n) begin

if(!rst_n)

data_out <= 16'h0000;

else if(data_out_en1)

if(line0_data0 ^ line0_data1 ^ line0_data2 ^ line1_data0 ^ line1_data1 ^ line1_data2 ^ line2_data0 ^ line2_data1 ^ line2_data2)

data_out <= line1_data1;

else

data_out <= 16'hffff; //

end

*/

always @(posedge clk or negedge rst_n) begin

if(!rst_n)

data_out <= 16'h0000;

else if(data_out_en1)

if((line0_data0 == 16'h0000) && (line0_data1 == 16'h0000) && (line0_data2 == 16'h0000) && (line1_data0 == 16'h0000) && (line1_data1 == 16'h0000) && (line1_data2 == 16'h0000) && (line2_data0 == 16'h0000) && (line2_data1 == 16'h0000) && (line2_data2 == 16'h0000))

data_out <= line1_data1;

else if((line0_data0 == 16'hffff) && (line0_data1 == 16'hffff) && (line0_data2 == 16'hffff) && (line1_data0 == 16'hffff) && (line1_data1 == 16'hffff) && (line1_data2 == 16'hffff) && (line2_data0 == 16'hffff) && (line2_data1 == 16'hffff) && (line2_data2 == 16'hffff))

data_out <= line1_data1;

else

data_out <= 16'hffff;

end

endmodule

IP設(shè)置

圖4 line3x3 IP

如圖4所示,shift register(RAM-based)ip主要為了形成三行像素緩存。

4.3TFT顯示屏的行緩存大小為480,5TFT顯示屏的行緩存大小為800。

4實(shí)驗(yàn)結(jié)果

圖5 實(shí)驗(yàn)原圖

圖6 原圖顯示

圖7 腐蝕后的結(jié)果

結(jié)果分析:

圖6和圖7進(jìn)行對比,圖6中最細(xì)的圖案在圖7中已經(jīng)消失,比較粗的線條也相對變細(xì),實(shí)驗(yàn)成功。如果大家想進(jìn)行更大力度的腐蝕可以使用更大的模板。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
關(guān)閉