快速中值滤波(直方图)

1.介绍

    中值滤波的优点是可以很好的过滤掉椒盐噪声,缺点是易造成图像的不连续性,当提到中值滤波的实现方法,我们很快能想到的办法就是先排序,再取中间值,其时间复杂度取决于排序算法,如果图片特别大,每到一个地方,就排序一次,那就特别慢了。当我们做中值滤波的时候,每个点与点之间是有重复部分,比如在下图中,深黄与浅黄构成A点,当我们移动一个像素的时候,就是B点,而B点是由浅黄和深蓝构成,中间的公有部分就是浅黄,如果有一种算法可以借用A点已经计算过的浅黄,那么速度就会提高很多,这个时候,基于直方图中值滤波就要横空出世了。

6551e6ecd096bc833a12443e1f4c72c5.png

 

2.实现原理

    1.读取图像I,并且设定滤波窗口大小(winX*winY),一般winX=winY,奇数。

    2.设定中值滤波直方图中的阈值,Thresh=(winX*winY)/2 +1;(在直方图统计表中,从最左边的点个数慢慢累积,类似于桶排序,可以找到中值)

    3.如果要考虑边界情况,可以先对原图像进行扩展,左、右边界分别扩展winX/2个像素,上下边界分别扩展winY/2个像素。

    4.逐行遍历图像像素,以第一行为例:先取第一行第一个要处理的像素(窗口中心像素),建立滤波窗口,提取窗口内所有像素值(N=winX*winY个),获取N个像素的直方图Hist。从左到右累加直方图中每个灰度层级下像素点个数,记为sumCnt,直到sumCnt>=Thresh,这时的灰度值就是当前窗口内所有像素值的中值MediaValue。将MediaValue值赋值给窗口中心像素,表明第一个像素中值滤波完成。

    5.此时窗口需要向右移动一个像素,开始滤波第二个像素,并且更新直方图。以第二个像素为窗口中心建立滤波窗口,从前一个窗口的灰度直方图Hist中减去窗口中最左侧的一列像素值的灰度个数,然后加上窗口最右侧一列像素值的灰度个数。完成直方图的更新。

    6.直方图更新后(这一步,网上好多说得不清楚,和代码写得不一样,我在这里只写代码里面是怎样实现的),从左到右累加直方图中每个灰度层级下像素点个数,记为sumCnt,直到sumCnt>=Thresh,这时的灰度值就是当前窗口内所有像素值的中值MediaValue。将MediaValue值赋值给窗口中心像素,表明第这个像素中值滤波完成(相当于是从0开始统计的)。

    7.窗口逐行依次滑动,求得整幅图像的中值滤波结果。

 

3.代码实现

    我觉得我写的流程很清楚,因而写代码应该是一件很容易的事,就不贴了,网上一搜也是一大把

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值