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

时间:2015-05-30 22:27:53

标签: python image-processing numpy 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)

虽然这会生成一张图像,其原始数据中存在类似分布的斑点,但我的图片 的斑点强度不均匀,而且其中一些斑点的大小不止一个像素(尽管它们都不超过2个)。此外,我的图像上有一些点 直径。

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

1 个答案:

答案 0 :(得分:9)

你可以简单地尝试一个内核小的中值过滤器,

from scipy.ndimage import median_filter

filtered_array = median_filter(random_array, size=3)

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

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

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