在没有数据像素时对图像应用过滤器

2024-06-18 11:45:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含许多无数据像素的图像。图像为2d numpy数组,无数据值为“无”。每当我尝试在它上应用过滤器时,似乎内核中都会考虑到none值,并使我的像素消失

例如,我有这样的图像:
enter image description here

我已尝试使用此函数对其应用lee筛选器(取自Speckle ( Lee Filter) in Python):

from scipy.ndimage.filters import uniform_filter
from scipy.ndimage.measurements import variance

def lee_filter(img, size):
    img_mean = uniform_filter(img, (size, size))
    img_sqr_mean = uniform_filter(img**2, (size, size))
    img_variance = img_sqr_mean - img_mean**2

    overall_variance = variance(img)

    img_weights = img_variance / (img_variance + overall_variance)
    img_output = img_mean + img_weights * (img - img_mean)
    return img_output

但结果如下:
enter image description here

警告:

UserWarning: Warning: converting a masked element to nan. dv = np.float64(self.norm.vmax) - np.float64(self.norm.vmin)

我还尝试使用图书馆findpeaks


from findpeaks import findpeaks
import findpeaks
#lee enhanced filter
image_lee_enhanced = findpeaks.lee_enhanced_filter(img, win_size=3, cu=0.25)

但我得到了同样的空白图像。 当我在同一张图像上使用中值滤波时,ndimage的工作没有问题

我的问题是如何在不让“无”值中断结果的情况下对图像运行这些过滤器?

编辑:我不喜欢将无值像素设置为0,因为像素范围值在-50-1之间(是索引值)。此外,我担心如果我将其更改为任何其他值(例如9999),它也会影响过滤器(我错了吗?)

编辑2:我已经阅读了Cris Luengo的答案,并尝试应用与scipy.ndimage中值滤波器类似的东西,因为我意识到结果也不正确。

这是原始图像:

enter image description here

我已尝试屏蔽空值:


idx = np.ma.masked_where(img,img!=None)[:,1]
median_filter_img = ndimage.median_filter(img[idx].reshape(491, 473), size=10)
zeros = np.zeros([img.shape[0],img.shape[1]])

zeros[idx] = median_filter_img

结果如下所示(颜色较深,以便在边缘看到问题):

enter image description here

可以看出,边值似乎是无值的影响。 我也和img一起做过=0,但遇到了相同的问题

(仅添加:像素值在1到-35之间)


Tags: from图像import过滤器imgsizenp像素
2条回答

似乎一个简单的解决方案是将非值设置为零。我不知道你会如何解决这个问题,因为大多数图像处理内核都需要一些值来帮助你应用。 a[numpy.argwhere(a==None)]=0

如果要应用线性平滑滤波器,则可以使用归一化卷积

基本配方是:

  1. 创建一个掩码图像,对于有数据的像素为1,对于没有数据的像素为0
  2. 将没有数据的像素设置为任何数字,例如0。NaN无效,因为它在计算中传播
  3. 将线性平滑过滤器应用于与遮罩相乘的图像
  4. 将线性平滑过滤器应用于遮罩
  5. 将两个结果分开

基本上,我们将线性平滑滤波器(卷积)的结果标准化为滤波器窗口内具有数据的像素数

在平滑遮罩为0(远离数据)的区域,我们将0除以0,因此需要特别注意

请注意,归一化卷积也可用于不确定数据,其中遮罩图像获得0到1之间的值,表示我们对每个像素的置信度。例如,被认为有噪声的像素可以设置为比其他像素更接近0的值


上述配方仅适用于线性平滑滤波器。归一化卷积可以用其他线性滤波器来实现,例如导数滤波器,但是得到的方法是不同的。例如,请参见here归一化卷积方程以计算导数


对于非线性滤波器,需要其他方法。例如,非线性平滑过滤器通常会避免影响边缘,因此在缺少数据的图像中,如果缺少的像素设置为0,或设置为数据范围之外的某个值,则该过滤器会非常好地工作。保留一个遮罩图像的概念,该图像指示哪些像素有数据,哪些没有数据始终是一个好主意

相关问题 更多 >