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の実装手順:
- Gx = P * Sobelx(元の画像はX方向にsobel演算子で畳み込まれます)
- Gy = P * Sobely(元の画像はY方向にソーベル演算子で畳み込まれます)
- G = sqrt(G ^ 2 x + G ^ 2 y)
- しきい値の比較は、エッジ検索後にバイナリイメージを形成します。
-
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システム設計・検証実践ガイド」
【注】:個人学習ノート、間違いがありましたら、お気軽に教えてください、丁寧です~~~