基于FPGA的快速中值滤波算法--转载我之前的blog的内容

转:  http://xiongwei.site/          

在实时图像采集中,不可避免的会引入噪声,尤其是干扰噪声和椒盐噪声,噪声的存在严重影响边缘检测的效果,中值滤波是一种基于排序统计理论的非线性平滑计数,能有效平滑噪声,且能有效保护图像的边缘信息,所以被广泛用于数字图像处理的边缘提取,其基本原理是把数字图像或数字序列中的一点的值用该点邻域内所有点的中值来代替。

中值滤波对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,使之不被模糊。这些优良特性是线性滤波方法所不具有的。此外,中值滤波的算法比较简单,也易于用硬件实现。所以,中值滤波方法一经提出后,便在数字信号处理领得到重要的应用。

中值滤波方法是,对待处理的当前像素,选择一个模板,该模板为其邻近的若干个像素组成,对模板的像素由小到大进行排序,再用模板的中值来替代原像素的值的方法。

当我们使用3x3窗口后获取领域中的9个像素,就需要对9个像素值进行排序,为了提高排序效率,排序算法思想如图3-18所示

(1) 对窗内的每行像素按降序排序,得到最大值、中间值和最小值;

(2) 把三行的最小值相比较,取其中的最大值;

(3) 把三行的最大值相比较,取其中的最小值;

(4) 把三行的中间值相比较,再取一次中间值;

(5) 把前面的到的三个值再做一次排序,获得的中值即该窗口的中值。

中值滤波的3x3矩阵的生成和均值滤波是完全类似的。我们求中值的方法是,先对3x3矩阵的每行按从大到小进行排序,然后利用排序法求出最大值那一列的最小值,求出之间数那一列的中间值,求出最小值按一列的最大值,最后将求出的三个值再排序,这三个值的中间值就是这个3x3矩阵的中间值。

这里我们开始想一个问题,用3x3矩阵排序来替代中间值,那么图像的边缘区域怎么办?这是一个问题,在这里我的做法是对齐置之不理。怎么生成3x3的移动窗口,而且图像的像素有比较大,那么我们需要对其进行行缓存。一般做法是ram和fifo,还有就是altera公司的shift_ram(貌似专门为图像处理而生),因为我是基于Xilinx平台的ise,所以这里我自己设计了一个类似shift_ram的ip,基于两个fifo,深度为512. 下面就是行缓存的代码:

module shift_line_buffer(
				input 	wire	 		line_clk			,
				input 	wire			s_rst_n				,	
				input	wire 			in_line_vaild		,//在有效数据提前一个周期
				input 	wire 	[7:0]	din					,
				input  	wire			vsync				,//帧同步
				output 	wire	[7:0] 	taps0x				,
				output 	wire	[7:0] 	taps1x				,
				output	wire	[7:0] 	taps2x				,
				output  wire			done
);

`ifndef SIM
localparam IMAGE_WIDTH = 480 ;//
`else
localparam IMAGE_WIDTH = 8 ;//480X272
`endif

wire empty1,empty2,pop1_en,pop2_en;
reg rd1_en,rd2_en;

wire prog_full1,prog_full2;
assign pop1_en=(prog_full1==1)?1'b1:vsync;//0?
always @(posedge line_clk or negedge s_rst_n)begin
	if(s_rst_n == 0)
		rd1_en=0;
	else if(pop1_en== 1 && in_line_vaild== 1)
		rd1_en=1;
	else if(empty1==1)
		rd1_en=0;		
end

fifo_512x8	fifo_512x8_inst1(
  .clk
  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
基于FPGA滤波算法的设计与实现 摘 要 在图像的采集、传输和记录等过程,由于受到多方面因素的影响,图像信号会不可避免地受到椒盐噪声的污染,这将会严重影响图像的后期分析和识别等处理,因此有必要用滤波器对图像的椒盐噪声进行滤波预处理。 实际应用,对滤波器件不仅要求能够将图像的椒盐噪声滤除,满足图像处理的实时性要求,而且还要求能够很好地保护图像细节,避免滤波后图像变得模糊。针对传统的快速滤波算法在滤除图像椒盐噪声时存在图像细节模糊的缺陷,本文提出了一种基于FPGA的改进的快速滤波算法。该算法滤波过程,首先根据设定的阈判断滤波窗口的心像素点的是否为噪声点,若是噪声点,就利用快速滤波算法求出并替换心点的原像素,若不是噪声点,就不进行滤波处理。利用MATLAB软件对该算法进行仿真的结果表明,该算法具有良好的去噪和图像细节保持的能力。 在该算法FPGA实现过程,充分利用FPGA硬件的并行性,并且采用流水线技术,提高了图像滤波的处理速度。FPGA硬件实现的结果表明,该算法与传统的快速滤波算法相比,不仅能够满足图像处理的实时性要求,而且还能在滤除图像椒盐噪声的同时,避免滤波后图像变得模糊的缺陷,达到了保护原始图像细节的目的。
滤波算法是一种常用的图像处理算法,用于去除图像的噪声。它通过对图像的每个像素点周围的像素进行排序,并将作为该像素点的新,从而实现去噪的效果。 以下是一个使用C语言实现滤波算法的示例代码: ```c #include <stdio.h> // 定义图像的宽度和高度 #define WIDTH 320 #define HEIGHT 240 // 定义滤波的窗口大小 #define WINDOW_SIZE 3 // 滤波函数 void median_filter(unsigned char* input, unsigned char* output) { int i, j, k, l; unsigned char window[WINDOW_SIZE * WINDOW_SIZE]; for (i = 0; i < HEIGHT; i++) { for (j = 0; j < WIDTH; j++) { // 获取当前像素点周围的像素 int count = 0; for (k = -WINDOW_SIZE/2; k <= WINDOW_SIZE/2; k++) { for (l = -WINDOW_SIZE/2; l <= WINDOW_SIZE/2; l++) { int x = i + k; int y = j + l; if (x >= 0 && x < HEIGHT && y >= 0 && y < WIDTH) { window[count++] = input[x * WIDTH + y]; } } } // 对周围像素进行排序 for (k = 0; k < count-1; k++) { for (l = 0; l < count-1-k; l++) { if (window[l] > window[l+1]) { unsigned char temp = window[l]; window[l] = window[l+1]; window[l+1] = temp; } } } // 将作为新的像素 output[i * WIDTH + j] = window[count/2]; } } } int main() { unsigned char input[WIDTH * HEIGHT]; // 输入图像 unsigned char output[WIDTH * HEIGHT]; // 输出图像 // TODO: 从文件或摄像头等方式获取输入图像数据 // 对输入图像进行滤波处理 median_filter(input, output); // TODO: 将输出图像保存到文件或显示到屏幕等方式 return 0; } ``` 以上代码实现了一个简单的滤波算法,通过传入输入图像数据和输出图像数据的指针,可以对输入图像进行滤波处理,并将结果保存到输出图像。你可以根据实际需求,将图像数据从文件或摄像头等方式获取,以及将结果保存到文件或显示到屏幕等方式展示。 请注意,以上代码只是一个简单的示例,实际应用可能需要考虑更多的细节,比如边界处理、优化算法性能等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值