基于FPGA的二值圖像的膨脹算法的實(shí)現(xiàn)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
基于FPGA的二值圖像的膨脹算法的實(shí)現(xiàn)
1 背景知識(shí)
二值圖像(Binary Image)是指將圖像上的每一個(gè)像素只有兩種可能的取值或灰度等級(jí)狀態(tài),人們經(jīng)常用黑白、B&W、單色圖像表示二值圖像。二值圖像是指在圖像中,灰度等級(jí)只有兩種,也就是說,圖像中的任何像素不是0就是1,再無其他過渡的灰度值。
二值圖像經(jīng)常出現(xiàn)在數(shù)字圖像處理中作為圖像掩碼或者在圖像分割、二值化和dithering的結(jié)果中出現(xiàn)。一些輸入輸出設(shè)備,如激光打印機(jī)、傳真機(jī)、單色計(jì)算機(jī)顯示器等都可以處理二值圖像。
二值圖像經(jīng)常使用位圖格式存儲(chǔ)。
二值圖像可以解釋為二維整數(shù)格,圖像變形處理領(lǐng)域很大程度上就是受到這個(gè)觀點(diǎn)啟發(fā)。
膨脹與腐蝕是形態(tài)學(xué)濾波的兩個(gè)基本運(yùn)算,能實(shí)現(xiàn)多種多樣的功能,主要功能如下:
(1)消除噪聲;
(2)分割出獨(dú)立的圖像元素;
(3)在圖像中連接相鄰的元素;
(4)尋找圖像中明顯的極大值和極小值區(qū)域;
(5)求出圖像的梯度。
膨脹數(shù)學(xué)模型:
(1)
圖1 具有斷裂文字的低分辨率樣品文字(見放大的視圖)
如圖1所示,a為具有斷裂文字的低分辨率樣品文字(見放大的視圖),b為結(jié)構(gòu)元,c為圖b對(duì)a的膨脹。斷裂線段被連接起來了。
2 膨脹算法
在這里我們演示黑色膨脹過程。
圖2 膨脹演示
在二值圖像的膨脹算法過程中我們使用二值圖像3x3圖像矩陣,由圖1可知,當(dāng)九個(gè)格子中只要出現(xiàn)一個(gè)‘0’,經(jīng)過膨脹算法后(x,y)點(diǎn)的值都會(huì)是‘0’。
只有(x,y)點(diǎn)以及相鄰的八個(gè)點(diǎn)都是‘1’f(x,y)的值才是‘1’。這樣就完成了二值圖像的膨脹。
3 FPGA膨脹算法實(shí)現(xiàn)
圖3 二值圖像膨脹FPGA模塊架構(gòu)
圖3中我們使用串口傳圖傳入的是二值圖像。
FPGA源碼:
/*
Module name: binary_image_swell.v
Description: binary image swell.
*/
`timescale 1ns/1ps
module binary_image_swell(
input clk, //pixel clk
input rst_n,
input [15:0] data_in,
input data_in_en,
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;
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;
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;
end
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'h0000;
end
endmodule
4實(shí)驗(yàn)結(jié)果
圖4 實(shí)驗(yàn)原圖
圖5 實(shí)驗(yàn)原圖顯示結(jié)果圖
圖6 膨脹后的結(jié)果圖
結(jié)果分析:
由圖5和圖6來看,明顯線條被加粗,膨脹算法實(shí)現(xiàn)。
至此,有興趣的同學(xué)可以使用FPGA開發(fā)板自己來實(shí)驗(yàn)一下下面這個(gè)過程,已達(dá)到自我的理解和貫通。
RGB圖像->sobel算子邊緣檢測(cè)->二值圖像的腐蝕->二值圖像的膨脹。