基于FPGA的二值圖像的腐蝕算法的實(shí)現(xiàn)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
基于FPGA的二值圖像的腐蝕算法的實(shí)現(xiàn)
九層之臺,起于累土
1 背景知識
腐蝕和膨脹是形態(tài)學(xué)處理的基礎(chǔ),許多形態(tài)學(xué)算法都是以這兩種操作作為基礎(chǔ)的。
圖1 使用腐蝕去除圖像中的部件
圖1 a一幅大小為486x486的連線模板二值圖像,圖1b~d分別使用11x11,15X15和45X45的模板進(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.3寸TFT顯示屏的行緩存大小為480,5寸TFT顯示屏的行緩存大小為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)行更大力度的腐蝕可以使用更大的模板。