FPGA学习笔记_图像处理6_FPGA实现 sobel算子边缘检测算法

FPGA学习笔记

图像处理算法

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

1. sobel算子边缘检测算法

1.1 原理

  • 边缘检测:标识数字图像中变化明显那的点。
  • 结果体现:1. 深度上的不连续. 2. 表面方向不连续. 3. 物质属性变化. 4.场景照明变化.
  • 应用:图像处理和计算机视觉
  • 边缘检测算子
    1阶:roberts cross算子, prewitt算子,sobel算子,kirch算子,罗盘算子
    2阶:canny算子,laplacian算子
  • Sobel算子:
    离散,1阶,差分算子,用于计算图像亮度函数的1阶梯度的近似值(梯度矢量,法矢量),具有方向性,可以检测竖直/垂直/全部。
    优缺点:效率比canny边缘检测高,但是边缘不如canny检测准确.

1.2 FPGA实现灰度图像均值滤波算法
FPGA学习笔记_图像处理6_FPGA实现 sobel算子边缘检测算法_第1张图片

  • FPGA实现步骤
  1. Gx=P*Sobelx (原始图像与sobel算子X方向卷积)
  2. Gy=P*Sobely(原始图像与sobel算子Y方向卷积)
  3. G= sqrt(G^2 x+G^2 y)
  4. 阈值比较形成边缘查找后的二值图像。
  • FPGA实现方法:
    项目工具:
    ① 硬件:Intel Cyclone IV E系列FPGA开发板,5寸(800*480)TFT电容触摸显示屏,
    ② 软件:Quartus软件,Picture2Hex软件
    FPGA学习笔记_图像处理6_FPGA实现 sobel算子边缘检测算法_第2张图片项目组成模块:
    ① pll: 产生项目所需时钟:1. SDRAM控制器时钟;2. SDRAM时钟信号;3. TFT屏控制器时钟
    ② uart串口协议(uart_rx, uart_tx)
    ③ 读FIFO
    ④ 写FIFO
    ⑤ SDRAM控制模块
    ⑥ TFT屏控制模块
    ⑦ sobel算子边缘检测模块

  • 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). (易烊千玺^^)网络原图:
    FPGA学习笔记_图像处理6_FPGA实现 sobel算子边缘检测算法_第3张图片
    (2). FPGA显示原图:FPGA学习笔记_图像处理6_FPGA实现 sobel算子边缘检测算法_第4张图片

(3). FPGA sobel算子边缘检测图:

  • Threshold(阈值)=3:
    FPGA学习笔记_图像处理6_FPGA实现 sobel算子边缘检测算法_第5张图片

  • Threshold(阈值)=5:FPGA学习笔记_图像处理6_FPGA实现 sobel算子边缘检测算法_第6张图片

  • Threshold(阈值)=7:
    FPGA学习笔记_图像处理6_FPGA实现 sobel算子边缘检测算法_第7张图片
    项目结果分析:

  • 对比 Threshold(阈值) = 3,5,7 三幅图可以发现,经过sobel算子边缘检测后的图像,随着阈值的增加,图像的细节越来越少;


参考资料:《FPGA系统设计与验证实战指南》

【注】:个人学习笔记,如有错误,望不吝赐教,这厢有礼了~~~


你可能感兴趣的:(FPGA学习笔记,#,图像处理,算法,图像处理,fpga/cpld,verilog)