如何使用 SciPy/NumPy 从图像中查找和删除白色斑点?
How do I find and remove white specks from an image using SciPy/NumPy?
我有一系列图像作为我的原始数据,我正在尝试准备发布这些图像。这些图像有一系列随机的白色斑点,我想用周围一些像素的平均值替换。
我不能 post 图片,但下面的代码应该会生成一个 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)
虽然这应该会生成一张图像,其原始数据中的斑点 分布 相似,但我的图像 没有 斑点强度均匀,一些斑点的大小超过一个像素(尽管 none 其中超过 2 个)。此外,我的图像上有一些我 不想 想要改变的斑点,这些斑点在数据采集期间 故意 饱和,以便呈现时清晰:这些斑点的直径约为 10 个像素。
原则上,我可以写一些东西来寻找值超过特定阈值的像素,然后将它们与最近邻居的平均值进行比较。但是,我认为我最终要实现的目标在图像处理中并不少见,而且我非常怀疑有一些 SciPy 功能可以做到这一点而无需重新发明轮子。我的问题是我对图像处理的正式 aspects/vocabulary 不够熟悉,无法真正知道我应该寻找什么。有人能指出我正确的方向吗?
您可以简单地尝试使用较小内核大小的中值滤波器,
from scipy.ndimage import median_filter
filtered_array = median_filter(random_array, size=3)
这将在不显着改变原始图像的情况下去除斑点。
中值滤波器非常适合此类任务,因为与简单的移动平均滤波器相比,它可以更好地保留具有高空间频率的原始图像中的特征。
顺便说一下,如果您的图像是实验性的(即嘈杂的),应用非激进的中值滤波器(例如上面的那个)永远不会有坏处,因为它也可以衰减噪声。
我有一系列图像作为我的原始数据,我正在尝试准备发布这些图像。这些图像有一系列随机的白色斑点,我想用周围一些像素的平均值替换。
我不能 post 图片,但下面的代码应该会生成一个 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)
虽然这应该会生成一张图像,其原始数据中的斑点 分布 相似,但我的图像 没有 斑点强度均匀,一些斑点的大小超过一个像素(尽管 none 其中超过 2 个)。此外,我的图像上有一些我 不想 想要改变的斑点,这些斑点在数据采集期间 故意 饱和,以便呈现时清晰:这些斑点的直径约为 10 个像素。
原则上,我可以写一些东西来寻找值超过特定阈值的像素,然后将它们与最近邻居的平均值进行比较。但是,我认为我最终要实现的目标在图像处理中并不少见,而且我非常怀疑有一些 SciPy 功能可以做到这一点而无需重新发明轮子。我的问题是我对图像处理的正式 aspects/vocabulary 不够熟悉,无法真正知道我应该寻找什么。有人能指出我正确的方向吗?
您可以简单地尝试使用较小内核大小的中值滤波器,
from scipy.ndimage import median_filter
filtered_array = median_filter(random_array, size=3)
这将在不显着改变原始图像的情况下去除斑点。
中值滤波器非常适合此类任务,因为与简单的移动平均滤波器相比,它可以更好地保留具有高空间频率的原始图像中的特征。
顺便说一下,如果您的图像是实验性的(即嘈杂的),应用非激进的中值滤波器(例如上面的那个)永远不会有坏处,因为它也可以衰减噪声。