中值滤波
将 3*3 滑动块中的灰度值进行排序,然后用排序的中间值取代 3*3 滑块中心的值。示意图如下图所示。
实现原理(这是文献中的,理解起来比较复杂,最近我又学到一种更加简单快捷的方法,补充在最后)
通过如下图所示的6级比较电路路输出中值,其输人数据为图1所示的滤波掩膜所在的图像数据。第一级比较电路由3个三输入比较器C组成,每个比较器的输出数据依序排列(参见图示)。将3组比较结果中最小的3个数放在一起、中间的3个数放在一起、最大的3个数放在一起,参加第二级比较。第二级比较电路的原理与第一级类似,输出out1和out9,分别是输入数据中的最大值和最小值,这2个数据将被舍去不参加下一级比较。参加第三级比较的有7个数据,其原理类似于前两级比较电路,输出out2和out8分别是该7个数据的最大值和最小值,并且被舍去,仅留下5个数据参加第四级比较。剩下的几级比较电路以类似于先前的原理进行比较。如此,经过6级比较后即可得到9个数据的标准中值滤波输出值out5,而outl,out2,⋯,out9分别是这9个数据从最大到最小的顺序排列值。此外。为了保证流水线操作过程中数据的同步性,在第三级和第五级比较电路中需要插入数据寄存器R缓存当前该级中不参与比较的数据。
说明:中值滤波也是基于3*3的像素矩阵,有关3*3矩阵的实现,在上一篇文章中详细讲过链接如下:http://www.cnblogs.com/aslmer/p/5779079.html。
此原理多次用到比较器,我将比较器分为两类,第一类:三个数进行比较,输出max、med、min。第二类:两个数进行比较,输出max、min。
第一类比较器的实现
module compare_1( data_a , data_b , data_c , data_max , data_min , data_med ); input [5:0] data_a ; input [5:0] data_b ; input [5:0] data_c ; output [5:0] data_max; output [5:0] data_min; output [5:0] data_med; wire [5:0] data_max; wire [5:0] data_min; wire [5:0] data_med; wire [5:0] a,b,c;//a,b,c代替三个输入,方便代码书写 assign a=data_a; assign b=data_b; assign c=data_c; assign data_med = (a<b)?(b<c)?b:(a>c)?a:c : (b>c)?b:(a<c)?a:c; assign data_min = (a<b)?(a<c)?a:c : (b>c)?c:b ; assign data_max = (a>b)?(a>c)?a:c : (b>c)?b:c ; endmodule
第二类比较器就是比较两个数大小,非常简单。
module compare_2 (
dat_1 ,
dat_2 ,
dat_max ,
dat_min
);
input [