【问题标题】:How do I find and remove white specks from an image using SciPy/NumPy?如何使用 SciPy/NumPy 从图像中查找和去除白斑?
【发布时间】:2015-08-13 15:25:42
【问题描述】:

我有一系列图像作为我正在尝试准备发布的原始数据。这些图像有一系列随机的白色斑点,我想用周围一些像素的平均值替换它们。

我无法发布图片,但以下代码应生成一个与我正在尝试纠正的问题近似的 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)。此外,我的图像上有一些我不想想要更改的点在数据采集过程中有意为了清晰显示而饱和:这些点大约为 10 像素直径。

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

【问题讨论】:

  • 您要查找的操作是 despeckle 操作。基本上不是取像素与周围像素的平均值,而是取中位数(亮度)。有一个很好的例子here
  • 还有另一种方法here,通过分析标准差进行去斑,然后在标准差足够低时使用均值过滤器。
  • 感谢您的建议。另一位用户推荐了一个可以解决问题的 SciPy 内置程序。
  • 是的,我赞成那个,因为这正是你要找的。 :-)

标签: python image-processing numpy scipy


【解决方案1】:

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

from scipy.ndimage import median_filter

filtered_array = median_filter(random_array, size=3)

这将在不明显改变原始图像的情况下去除斑点。

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

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

【讨论】:

    猜你喜欢
    • 2014-01-12
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多