论文《Non-Local Means Denoising》还提到了一个块级别的NLM,原理和像素级别的是一样的,只是它没有计算相似性累加那一步,直接使用的块累加,公式如下:
(5)
(6)
它是以块为单位进行计算的,公式(6)是先计算块B和Q的diff,带入公式(7)的d^2里面,就可以算出块的权重,假设块大小是5×5,此时就会计算出5×5个权重
(7)
然后套用公式(5),用得到的w乘以当前搜索块就能得到当前的滤波结果,把搜索窗口内所有的权重块和滤波块累加起来,最后用滤波块的结果除以累加权重,最后得到一个块的滤波结果。这种方法得到的结果就像是公式(8)描述的一样,类似于多个Q的叠加计算均值,只是权重是变化的,对于平坦区域类似于均值的结果,边界区域参与叠加的像素个数较少,起到一个保边的作用。
(8)
如果直接把滤波块作为输出,那就像是玩拼图一样,边界处的滤波结果可能会产生错位,最后的降噪图像中会有块效应,如果是视频播放,还有可能出现块闪烁,所以一般用块做的算法都会有后续的处理。
下图显示的效果只取了滤波块的中心点像素,不同参数的效果图如下:
图8显示的效果中没有出现噪声成团的现象,这个和权重的计算方式有关,按块做的这种算法相当于一个空域权重全为1的双边滤波,所以如果只取中心点像素,不如就直接使用双边滤波。
此外,分析一下按像素做的特点,按照上篇《Non-Local Means(上)》公式(1)它把窗口内的差值做了求和,这一步其实是会让一些比较大的孤立噪声在相邻的窗口内持续的起作用,造成相邻块计算出的权重也比较小,平坦区域的降噪力度在部分区域变小,最后降噪力度不均匀,严重的时候还会产生伪纹理。
(1)
具体算法实现已公开发表在Github,GitHub - WuYiningOdell/Image_processing_algorithm