MedianBlur(中值滤波/百分比滤波器)

介绍了一种在常数时间内实现的快速中值滤波算法,该算法的时间复杂度为o(1),对不同半径的滤波效果稳定。通过对比实验表明,在大半径滤波时,该算法相比Photoshop有着明显的速度优势。

转自:MedianBlur(中值滤波/百分比滤波器)

文件中包含:Median Filter in Constant Time.pdf

            A fast median filter using AltiVec.pdf
            ctmf.c
            ctmf.h

参考资料下载: http://files.cnblogs.com/Imageshop/MedianFilter.rar

Median Filter in Constant Time.pdf这篇文章的算法很简单明了,算法的时间复杂度为o(1)对半径基本不敏感算法的主要优化思想粗分直方图细分直方图,利用高位和低位缩小寻中值的时间。当然,这个算法对搞图像效果的朋友来说更实际,因为一般实际需求不会要特大半径的中值模糊。

通过编码和速度比较,在小半径时,算法的速度比不上PS,但是在大半径,比如100的时候,针对4000*3000*24的图像,上述算法用时大概在7S,PS要25S。

稍微更改下(修改的应该是利用直方图求中值的函数,以得到百分比滤波器),就可以实现任意百分比算法了,中值可以看成是50%百分比的特例,PS的最大值(100%)最小值(0%)算法也可以利用这个实现了。



算法的有些细节还在琢磨中,不过基本已经弄懂了,算法执行的耗时部分还是在直方图更行那一块。

C/C++ code
?
1
2
3
4
5
6
7
static inline void histogram_add( const uint16_t x[16], uint16_t y[16] )
{
    int i;
    for ( i = 0; i < 16; ++i ) {
        y[i] += x[i];
    }
}
inline关键词为内联函数的的关键词,优快云上面有说明。

类似这个函数建议把循环展开,速度能提高不少。

还有我在实际实践的时候(我用的是C#,没有inline的),发现如果把这个子函数直接写到主函数中,速度反而会下降,通过反编译分析原因,应该是如果调用子函数,虽然有一些进栈和出栈的的操作,但是可以充分利用访问寄存器比访问内存快很多的特点来优化速度。



<think>好的,用户想了解百分位滤波的概念和实现方法。首先,我需要明确什么是百分位滤波。根据已有的知识,中值滤波是取窗口内数值的中位数,而百分位滤波可能类似,但取的是特定百分位的值。比如,中值对应50%分位,而用户提到的百分位滤波可能允许选择其他分位,比如25%或75%。 接下来,我应该回顾已有的引用资料。引用[4]提到了MedianBlur中值滤波/百分比滤波器),这可能说明百分位滤波是中值滤波的扩展,通过调整百分位参数来实现不同的滤波效果。此外,引用[2]讨论了均值滤波和非局部均值滤波,其中均值滤波是线性的,而百分位滤波属于非线性滤波,类似于中值滤波。 需要确定百分位滤波的具体实现步骤。一般来说,步骤可能包括:确定滤波窗口大小,对窗口内的像素值排序,然后根据设定的百分位选择对应的值作为输出。例如,80%分位会选择排序后第80%位置的数值。 然后,考虑如何用代码实现。参考引用中的Python示例,如最小值滤波器的实现,可以仿照其结构。用户可能需要一个函数,接受图像、窗口尺寸和百分位参数,然后遍历每个像素,提取窗口内的像素,排序后取对应分位的值。 还需要注意边界处理,比如当窗口超出图像边界时如何处理。常见的做法有填充(如镜像填充、零填充)或仅处理有效区域。此外,窗口的形状通常为矩形,但也可以是其他形状,不过矩形较为常见。 另外,性能优化方面,引用[4]提到内联函数或直接在主函数中处理可能影响速度,需要注意代码的效率。例如,避免在循环中重复创建数组,可以预先分配内存,或者使用更高效的排序算法。 用户可能的问题还包括百分位滤波的应用场景。比如,去除特定类型的噪声,如保留边缘的同时平滑图像,或者用于图像增强。不同分位数的选择会影响结果,高百分位可能保留较亮的区域,低百分位则保留较暗的特征。 最后,需要验证这些思路是否正确,确保引用的资料支持这些结论。例如,引用[4]将中值滤波百分比滤波器联系起来,说明百分位滤波是存在的,并且实现方式类似,只是分位数不同。同时,引用[2]的均值滤波是非线性的,而百分位滤波也属于非线性滤波,这一点需要明确。</think>### 百分位滤波的概念与实现方法 #### 1. 概念解析 **百分位滤波**是一种非线性滤波算法,通过对局部窗口内像素值的排序结果取指定百分位数的值作为输出。其核心思想与中值滤波(取50%分位数)类似,但可通过调整百分位参数(如25%、75%)实现不同的滤波效果。例如: - **80%分位滤波**:取窗口内排序后80%位置的像素值,偏向保留较亮区域; - **20%分位滤波**:取窗口内排序后20%位置的像素值,偏向保留较暗区域[^4]。 #### 2. 实现步骤 1. **定义窗口尺寸**:选择滤波窗口大小(如3×3、5×5)。 2. **遍历图像像素**:对每个像素,提取其周围窗口内的像素值。 3. **排序与分位选择**: - 将窗口内像素值按从小到大排序; - 根据百分位参数计算索引位置:$index = \text{floor}(k \times (N-1))$,其中$k$为分位值(如0.8),$N$为窗口内像素总数。 4. **边界处理**:采用填充策略(如镜像填充、零填充)处理图像边缘。 #### 3. Python实现示例 ```python import numpy as np from scipy.ndimage import generic_filter def percentile_filter(image, window_size, percentile): def _percentile_func(values): sorted_values = np.sort(values) k = percentile / 100.0 index = int(k * (len(sorted_values) - 1)) return sorted_values[index] return generic_filter(image, _percentile_func, size=window_size) # 示例:对图像应用80%分位滤波(窗口5x5) filtered_image = percentile_filter(input_image, window_size=5, percentile=80) ``` #### 4. 特点对比 | 滤波类型 | 计算方式 | 适用场景 | |------------|----------------|------------------------------| | 均值滤波 | 线性平均 | 快速去高斯噪声[^2] | | 中值滤波 | 50%分位 | 去除椒盐噪声 | | 百分位滤波 | 自定义分位 | 针对性保留明/暗特征 | | 最小值滤波 | 0%分位 | 去除正离群值噪声[^1] | #### 5. 应用场景 - **图像去噪**:通过调整分位数抑制特定方向的噪声(如高百分位抑制暗噪声)。 - **边缘保留**:相比均值滤波,能更好地保留边缘细节。 - **特征增强**:例如用高百分位滤波增强图像中的亮色目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值