如何使用SciPy/NumPy从图像中查找和删除白色斑点?

PMe*_*nde 6 python numpy image-processing scipy

我有一系列图像作为我的原始数据,我正在准备出版.这些图像随机出现了一系列白色斑点,我想用一些周围像素的平均值替换它们.

我无法发布图片,但以下代码应该生成一个PNG,它近似于我正在尝试纠正的问题:

import numpy as np
from scipy.misc import imsave

random_array = np.random.random_sample((512,512))

random_array[random_array < 0.999] *= 0.25

imsave('white_specs.png', random_array)
Run Code Online (Sandbox Code Playgroud)

虽然这应该会产生一个图像,其原始数据中存在类似的斑点分布,但我的图像没有强度均匀的斑点,并且一些斑点的大小不止一个像素(尽管它们都不超过2).此外,也有我的图像斑点我希望改变这种被故意提出当数据采集清晰的目的,在饱和:这些斑点直径约为10像素.

原则上,我可以写一些东西来寻找值超过某个阈值的像素,然后根据它们最近邻居的平均值来检查它们.但是,我认为我最终想要实现的并不是图像处理中不常见的动作,我非常怀疑有一些SciPy功能可以做到这一点而无需重新发明轮子.我的问题是我对图像处理的形式方面/词汇不够熟悉,才能真正了解我应该寻找什么.有人能指出我正确的方向吗?

rth*_*rth 9

您可以简单地尝试使用小内核大小的中值过滤器,

from scipy.ndimage import median_filter

filtered_array = median_filter(random_array, size=3)
Run Code Online (Sandbox Code Playgroud)

这将删除斑点而不会明显改变原始图像.

中值滤波器非常适合此类任务,因为与例如简单的移动平均滤波器相比,它可以更好地保留原始图像中具有高空间频率的特征.

顺便说一句,如果您的图像是实验性的(即噪声),应用非侵略性中值滤波器(例如上面的那个)永远不会伤害,因为它也允许衰减噪声.