FPGAスタディノート_画像処理6_ソーベル演算子エッジ検出アルゴリズムのFPGA実装

FPGAスタディノート

画像処理アルゴリズム

1.  sobel算子边缘检测算法
   1.1 原理
   1.2 FPGA实现 sobel算子边缘检测算法

1.Sobel演算子エッジ検出アルゴリズム

1.1原則

  • エッジ検出:デジタル画像に明らかな変化があるポイントを識別します。
  • 結果はのことを示しています。1。深さの不連続性。2。表面方向の不連続性。3。材料特性の変化。4。シーン照明の変化。
  • アプリケーション:画像処理とコンピュータービジョン
  • エッジ検出演算子
    1次:ロバーツクロス演算子、プレウィット演算子、ソーベル演算子、カーチ演算子、コンパス演算子
    2次:キャニー演算子、ラプラシアン演算子
  • Sobel演算子:
    離散、1次、差分演算子。画像の明るさ関数の1ステップの近似値(勾配ベクトル、法線ベクトル)を指向性で計算するために使用され、垂直/垂直/すべてを検出できます。
    長所と短所:効率はキャニーエッジ検出よりも高くなりますが、エッジはキャニー検出ほど正確ではありません。

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

  • FPGAの実装手順
  1. Gx = P * Sobelx(元の画像はX方向にsobel演算子で畳み込まれます)
  2. Gy = P * Sobely(元の画像はY方向にソーベル演算子で畳み込まれます)
  3. G = sqrt(G ^ 2 x + G ^ 2 y)
  4. しきい値の比較は、エッジ検索後にバイナリイメージを形成します。
  • FPGAの実装方法
    プロジェクトツール:
    ①ハードウェア:Intel Cyclone IV EシリーズFPGA開発ボード、5インチ(800 * 480)TFT容量性タッチスクリーン、
    ②ソフトウェア:Quartusソフトウェア、Picture2Hexソフトウェア
    ここに画像の説明を挿入プロジェクトコンポーネントモジュール:
    ①pll:プロジェクトの場所生成された必要性クロックである:1. SDRAMコントローラ・クロックは、2 SDRAMクロック信号; 3. TFTスクリーン・コントローラ・クロック
    ②UARTシリアルプロトコル(UART_RX、UART_TX)
    ③FIFO読み取り
    ④書き込みFIFO
    ⑤SDRAM制御モジュール
    ⑥TFT画面制御モジュール
    ⑦ソーベル演算をサブエッジ検出モジュール

  • Verilogコード

module sobel_r0(
	input				    clk,
	input				    rst_n,
	
	input				    data_in_en,
	input	     [9:0]		data_in,
	
	input		 [7:0]		threshold,
	
	output 	wire [9:0]	   data_out,
	output	wire		   data_out_en
);

	wire	[7:0]		r0;
	wire	[7:0]		r1;
	wire	[7:0]		r2;
	
	reg	[17:0]	Gx1;
	reg	[17:0]	Gx3;

	reg	[17:0]	Gy1;
	reg	[17:0]	Gy3;
	
	wire	[17:0]	Gx;
	wire	[17:0]	Gy;
	wire	[15:0]	G_final;
	
	reg				de_reg0;
	reg				de_reg1;
	reg				de_reg2;
	
	
	reg	[7:0]	r0_c0;
	reg	[7:0]	r0_c1;
	reg	[7:0]	r0_c2;

	reg	[7:0]	r1_c0;
	reg	[7:0]	r1_c1;
	reg	[7:0]	r1_c2;

	reg	[7:0]	r2_c0;
	reg	[7:0]	r2_c1;
	reg	[7:0]	r2_c2;
	
	
	
//----3*3 matrix pixels---------------------	
	shifter3_3 shifter3_3 (
	.clken(data_in_en),
	.clock(clk),
	.shiftin(data_in[9:2]),
	.shiftout(),
	.taps0x(r0),
	.taps1x(r1),
	.taps2x(r2)
	);
/*
	|r0_c0,r0_c1,r0_c2|
	|r1_c0,r1_c1,r1_c2|
	|r2_c0,r2_c1,r2_c2|
*/
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)begin
			r0_c0 <= 8'd0;
			r0_c1 <= 8'd0;
			r0_c2 <= 8'd0;
			
			r1_c0 <= 8'd0;
			r1_c1 <= 8'd0;
			r1_c2 <= 8'd0;

			r2_c0 <= 8'd0;
			r2_c1 <= 8'd0;
			r2_c2 <= 8'd0;
		end
		else if(data_in_en)begin
			r0_c0 <= r0;
			r0_c1 <= r0_c0;
			r0_c2 <= r0_c1;
			
			r1_c0 <= r1;
			r1_c1 <= r1_c0;
			r1_c2 <= r1_c1;
		
			r2_c0 <= r2;
			r2_c1 <= r2_c0;
			r2_c2 <= r2_c1;	
		end
	end
//------------------------------------------
//----Gx = P * sobelx,Gy = P * sobely-------
----mask x---------------------------
///*
//	|x11 x12 x13|       |-1,0,1|
//	|x21 x22 x23| <-->  |-2,0,2|
//	|x31 x32 x33|       |-1,0,1|
//*/

----mask y---------------------------
///*
//	|y11 y12 y13|       | 1, 2, 1|
//	|y21 y22 y23| <-->  | 0, 0, 0|
//	|y31 y32 y33|       |-1,-2,-1|
//*/
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)begin
			Gx1 <= 8'd0;
			Gx3 <= 8'd0;
			
			Gy1 <= 8'd0;
			Gy3 <= 8'd0;			

		end
		else if(data_in_en)begin
		   Gx1 <= r0_c0 + (r1_c0<<1) + r2_c0;//负数
			Gx3 <= r0_c2 + (r1_c2<<1) + r2_c2;//正数
			
			Gy1 <= r0_c0 + (r0_c1<<1) + r0_c2;//正数
			Gy3 <= r2_c2 + (r2_c1<<1) + r2_c2;//负数	
		end
	end
	assign Gx = (Gx1>Gx3)?(Gx1-Gx3):(Gx3-Gx1);
	assign Gy = (Gy1>Gy3)?(Gy1-Gy3):(Gy3-Gy1);
//--------------------------------------------
//----sqrt(Gx*Gx+Gy*Gy)-----------------------
	sqrt sqrt (
	.clk(clk),
	.radical(Gx*Gx+Gy*Gy),
	.q(G_final),
	.remainder()
	);
//------------------------------------------
//----阈值比较-------------------------------
	assign data_out = (G_final>threshold)?10'd0:10'b11_1111_1111;
//----timing---------------------------------
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)begin
			de_reg0	<=	1'b0;
			de_reg1	<=	1'b0;
			de_reg2	<=	1'b0;
		end
		else if(data_in_en)begin
			de_reg0	<=	data_in_en;
			de_reg1	<=	de_reg0;
			de_reg2	<=	de_reg1;		
		end		
	end
	assign data_out_en = de_reg2;
//---------------------------------------------
	
endmodule

  • プロジェクト結果
    5インチTFT静電容量式タッチスクリーン
    画像:800 * 480ピクセル
    (1)。(Yiyangqianxi ^^)元のネットワーク画像:(2)。FPGA
    ここに画像の説明を挿入
    ディスプレイの元の画像:ここに画像の説明を挿入

(3)。FPGAソーベル演算子エッジ検出図:

  • しきい値= 3:
    ここに画像の説明を挿入

  • しきい値= 5:ここに画像の説明を挿入

  • しきい値= 7:
    ここに画像の説明を挿入
    プロジェクト結果の分析:

  • しきい値= 3、5、7の3つの画像を比較すると、ソーベル演算子のエッジ検出後の画像は、しきい値の増加に伴い、画像の詳細がますます少なくなっていることがわかります。


参考資料:「FPGAシステム設計・検証実践ガイド」
【注】:個人学習ノート、間違いがありましたら、お気軽に教えてください、丁寧です~~~


おすすめ

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