FPGAスタディノート_画像処理5_グレースケール画像ガウスフィルタリングアルゴリズムのFPGA実装

FPGAスタディノート

画像処理アルゴリズム

1. 灰度图像高斯滤波算法
   1.1 原理
   1.2 FPGA实现灰度图像高斯滤波算法

1.グレースケール画像ガウスフィルタリングアルゴリズム

1.1原則

  • ガウスフィルター:線形平滑化フィルター、ローパスフィルター、ガウスノイズの除去に使用
  • 原理:加重平均は画像全体に対して実行され、各ピクセルの値は、フィールド内のそれ自体と他のピクセル値の加重平均によって取得されます。
  • 利点:境界効果を克服し、平均フィルターよりもソフトなスムージング効果があり、エッジの保持が優れています。

1.2グレースケール画像平均フィルタリングアルゴリズムのFPGA実装
ここに画像の説明を挿入

  • FPGAの実装手順

    1. F(x、y):( x、y)ポイントピクセル値
    2. G(x、y):ガウスフィルター処理後の(x、y)ポイントの値
    3. テンプレート(または畳み込み、マスク)を使用して、元の中央ピクセルの値ではなく、隣接するピクセルの加重平均グレー値を決定します。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))
    4. ガウスフィルターテンプレートを使用して画像のすべてのピクセルをスキャンします
  • FPGAの実装方法
    方法(2種類):1。R/ G / Bシングルチャンネルがグレースケール画像を形成してガウスフィルタリングに入る2.Ycbcr画像のYチャンネルがグレースケール画像を形成してガウスフィルタリングに入る1.R
    / G / Bグレースケール画像をガウスフィルターに形成する単一チャネル
    ここに画像の説明を挿入

  1. 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システム設計・検証実践ガイド」
【注】:個人学習ノート、間違いがありましたら、お気軽に教えてください、丁寧です~~~


おすすめ

転載: blog.csdn.net/weixin_50722839/article/details/113843499