FPGAスタディノート
画像処理アルゴリズム
1. 灰度图像高斯滤波算法
1.1 原理
1.2 FPGA实现灰度图像高斯滤波算法
1.グレースケール画像ガウスフィルタリングアルゴリズム
1.1原則
- ガウスフィルター:線形平滑化フィルター、ローパスフィルター、ガウスノイズの除去に使用
- 原理:加重平均は画像全体に対して実行され、各ピクセルの値は、フィールド内のそれ自体と他のピクセル値の加重平均によって取得されます。
- 利点:境界効果を克服し、平均フィルターよりもソフトなスムージング効果があり、エッジの保持が優れています。
1.2グレースケール画像平均フィルタリングアルゴリズムのFPGA実装
-
FPGAの実装手順:
- F(x、y):( x、y)ポイントピクセル値
- G(x、y):ガウスフィルター処理後の(x、y)ポイントの値
- テンプレート(または畳み込み、マスク)を使用して、元の中央ピクセルの値ではなく、隣接するピクセルの加重平均グレー値を決定します。G(x、y)=(1/16)(f(x-1、y- 1)+2 f(x、yi)+ f(x + 1、y-1)+ 2f(x-1、y)+ 4f(x、y)+ 2f(x + 1、y)+ f(x -1、y + 1)+ 2f(x、y + 1)+ f(x + 1、y + 1))
- ガウスフィルターテンプレートを使用して画像のすべてのピクセルをスキャンします
-
FPGAの実装方法:
方法(2種類):1。R/ G / Bシングルチャンネルがグレースケール画像を形成してガウスフィルタリングに入る2.Ycbcr画像のYチャンネルがグレースケール画像を形成してガウスフィルタリングに入る1.R
/ G / Bグレースケール画像をガウスフィルターに形成する単一チャネル
- Ycbcr画像のYチャネルはグレースケール画像を形成し、ガウスフィルターに入ります
- Verilogコード
/*
F(x,y): (x,y) 点的像素值
G(x,y): (x,y)点经过高斯滤波处理后的值
1. 用模板(或称卷积,掩膜)确定邻域像素的加权平均灰度值代替原中心像素点的值
G(x,y)=(1/16)*(f(x-1,y-1)+2*f(x,y-i)+f(x+1,y-1)+2f(x-1,y)+4f(x,y)+2f(x+1,y)+f(x-1,y+1)+2f(x,y+1)+f(x+1,y+1))
2. 用高斯滤波模板扫描图像的每一个像素
*/
module gauss_filter_r0(
input clk,
input rst_n,
input [15:0] data_in,//输入像素
input data_in_en,//LCD显示区使能信号
output reg [15:0] data_out,//输出高斯滤波处理后的像素
output wire data_out_en
);
wire [15:0] r0;
wire [15:0] r1;
wire [15:0] r2;
reg [15:0] r0_c0;
reg [15:0] r0_c1;
reg [15:0] r0_c2;
reg [15:0] r1_c0;
reg [15:0] r1_c1;
reg [15:0] r1_c2;
reg [15:0] r2_c0;
reg [15:0] r2_c1;
reg [15:0] r2_c2;
reg de_reg0;
reg de_reg1;
reg de_reg2;
reg de_reg3;
reg [31:0] guass_add;
reg [31:0] guass_reg0;
reg [31:0] guass_reg1;
reg [31:0] guass_reg2;
//----3行像素缓存-----------------------------------------
shifter3_3 shifter3_3(
.clken(data_in_en),
.clock(clk),
.shiftin(data_in),
.shiftout(),
.taps0x(r0),
.taps1x(r1),
.taps2x(r2)
);
//-------------------------------------------------------
//----3*3 matrix from image------------------------------
//----r0---------------------------------------------
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
r0_c0 <= 16'd0;
r0_c1 <= 16'd0;
r0_c2 <= 16'd0;
end
else if(data_in_en)begin
r0_c0 <= r0;
r0_c1 <= r0_c0;
r0_c2 <= r0_c1;
end
end
//----r1---------------------------------------------
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
r1_c0 <= 16'd0;
r1_c1 <= 16'd0;
r1_c2 <= 16'd0;
end
else if(data_in_en)begin
r1_c0 <= r1;
r1_c1 <= r1_c0;
r1_c2 <= r1_c1;
end
end
//----r2---------------------------------------------
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
r2_c0 <= 16'd0;
r2_c1 <= 16'd0;
r2_c2 <= 16'd0;
end
else if(data_in_en)begin
r2_c0 <= r2;
r2_c1 <= r2_c0;
r2_c2 <= r2_c1;
end
end
//--------------------------------------------------------
//----Timing----------------------------------------------
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
de_reg0 <= 1'd0;
de_reg1 <= 1'd0;
de_reg2 <= 1'd0;
de_reg3 <= 1'd0;
end
else if(data_in_en)begin
de_reg0 <= data_in_en;
de_reg1 <= de_reg0;
de_reg2 <= de_reg1;
de_reg3 <= de_reg2;
end
end
assign data_out_en = de_reg3;
//-------------------------------------------------------
//----guass filter---------------------------------------
/*
|(x-1,y-1),(x,y-i),(x+1,y-1) | |r0_c0,r0_c1,r0_c2 |
| (x-1,y), (x,y), (x+1,y) | <--> |r1_c0,r1_c1,r1_c2 |
|(x-1,y+1),(x,y+1),(x+1,y+1) | |r2_c0,r2_c1,r2_c2 |
高斯滤波公式:G(x,y)=(1/16)*(f(x-1,y-1)+2*f(x,y-i)+f(x+1,y-1)+
2f(x-1,y)+4f(x,y)+2f(x+1,y)+
f(x-1,y+1)+2f(x,y+1)+f(x+1,y+1))
*/
//----pipeline-------------------------------------------
//----1. MAC of each line-------------------------
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
guass_reg0 <= 32'd0;
guass_reg1 <= 32'd0;
guass_reg2 <= 32'd0;
end
else if(data_in_en)begin
guass_reg0 <= r0_c0+2*r0_c1+r0_c2;
guass_reg1 <= 2*r1_c0+4*r1_c1+2*r1_c2;
guass_reg2 <= r2_c0+2*r2_c1+r2_c2;
end
else;
end
//----2. ADD all-------------------------------
always@(posedge clk or negedge rst_n)
if(!rst_n)
guass_add <= 32'd0;
else if(data_in_en)
guass_add <= guass_reg0 + guass_reg1 +guass_reg2;
else;
//----3. divide 16-----------------------------
always@(posedge clk or negedge rst_n)
if(!rst_n)
data_out <= 16'd0;
else if(data_in_en)
data_out <= guass_add >>4;
//-------------------------------------------------------
endmodule
- 結果
5インチTFT静電容量式タッチスクリーン
画像:800 * 480ピクセル
(1)。(Yiyanqianxi ^^)元のネットワーク画像:
(2)。FPGAディスプレイの元の画像:
(3)。FPGAグレースケール処理画像:
(4)。FPGA平均フィルター図:
(5)。FPGAガウスフィルター図:
結果分析:
- グレースケール処理された画像と比較して、ガウスフィルタリング後の画像は柔らかく、平滑化効果は優れています。
- 平均フィルターマップと比較して、ガウスフィルター処理後の画像は画像の詳細を適切に保護できます。
参考資料:「FPGAシステム設計・検証実践ガイド」
【注】:個人学習ノート、間違いがありましたら、お気軽に教えてください、丁寧です~~~