没有数据像素时对图像应用滤镜
apply filters on images when there is no data pixels
我的图像包含许多无数据像素。图像是二维 numpy 数组,无数据值为“None”。每当我尝试在其上应用过滤器时,似乎 none 值已被考虑到内核中并使我的像素消失。
例如,我有这张图片:
我已尝试使用此功能(取自 )在其上应用 lee 过滤器:
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
但结果是这样的:
带有警告:
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 在同一图像上使用中值滤波器时没有问题。
我的问题是如何 运行 图像上的那些过滤器而不让 None 值中断结果?
编辑:我不喜欢将无值像素设置为 0,因为像素范围值在 -50-1 之间(是一个索引值)。此外,我担心如果我将其更改为任何其他值(例如 9999),它也会影响过滤器(我错了吗?)
编辑 2:
我已经阅读了 Cris Luengo 的回答,并且我已经尝试应用与 scipy.ndimage 中值过滤器类似的东西,因为我意识到结果也是混乱的。
这是原图:
我试过屏蔽 Null 值:
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
结果看起来像这样(颜色较深可以看出边缘的问题):
正如蜜蜂所见,边缘值似乎受到 None 值的影响。
我也用 img!=0 做了这个,但遇到了同样的问题。
(补充一下:像素值在 1 到 -35 之间)
似乎一个简单的解决方案是将非值设置为零。我不知道您将如何解决这个问题,因为大多数图像处理内核都需要一些价值才能供您应用。
a[numpy.argwhere(a==None)] = 0
如果要应用线性平滑滤波器,则可以使用归一化卷积。
基本配方是:
- 创建一个蒙版图像,其中有数据的像素为 1,没有数据的像素为 0。
- 将没有数据的像素设置为任意数字,例如 0。NaN 无效,因为它在计算中扩散。
- 对乘以掩码的图像应用线性平滑滤波器。
- 对蒙版应用线性平滑过滤器。
- 将两个结果相除。
基本上,我们通过过滤器内数据的像素数对线性平滑过滤器(卷积)的结果进行归一化 window。
在平滑掩码为0的区域(远离数据),我们将0除以0,因此需要特别注意。
请注意,归一化卷积也可用于不确定数据,其中蒙版图像的值介于 0 和 1 之间,表示我们对每个像素的置信度。例如,可以将被认为有噪声的像素设置为比其他像素更接近 0 的值。
上面的配方只对线性平滑滤波器有效。归一化卷积可以与其他线性滤波器一起完成,例如导数滤波器,但生成的配方不同。例如,参见 here 用于计算导数的归一化卷积方程。
对于非线性滤波器,其他方法是必要的。例如,非线性平滑滤波器通常会避免影响边缘,因此如果缺失像素设置为 0 或远离数据范围的某个值,则在缺失数据的图像中效果很好。保留指示哪些像素有数据而哪些像素没有数据的蒙版图像的概念始终是一个好主意。
我的图像包含许多无数据像素。图像是二维 numpy 数组,无数据值为“None”。每当我尝试在其上应用过滤器时,似乎 none 值已被考虑到内核中并使我的像素消失。
例如,我有这张图片:
我已尝试使用此功能(取自
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
但结果是这样的:
带有警告:
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 在同一图像上使用中值滤波器时没有问题。
我的问题是如何 运行 图像上的那些过滤器而不让 None 值中断结果?
编辑:我不喜欢将无值像素设置为 0,因为像素范围值在 -50-1 之间(是一个索引值)。此外,我担心如果我将其更改为任何其他值(例如 9999),它也会影响过滤器(我错了吗?)
编辑 2: 我已经阅读了 Cris Luengo 的回答,并且我已经尝试应用与 scipy.ndimage 中值过滤器类似的东西,因为我意识到结果也是混乱的。
这是原图:
我试过屏蔽 Null 值:
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
结果看起来像这样(颜色较深可以看出边缘的问题):
正如蜜蜂所见,边缘值似乎受到 None 值的影响。 我也用 img!=0 做了这个,但遇到了同样的问题。
(补充一下:像素值在 1 到 -35 之间)
似乎一个简单的解决方案是将非值设置为零。我不知道您将如何解决这个问题,因为大多数图像处理内核都需要一些价值才能供您应用。 a[numpy.argwhere(a==None)] = 0
如果要应用线性平滑滤波器,则可以使用归一化卷积。
基本配方是:
- 创建一个蒙版图像,其中有数据的像素为 1,没有数据的像素为 0。
- 将没有数据的像素设置为任意数字,例如 0。NaN 无效,因为它在计算中扩散。
- 对乘以掩码的图像应用线性平滑滤波器。
- 对蒙版应用线性平滑过滤器。
- 将两个结果相除。
基本上,我们通过过滤器内数据的像素数对线性平滑过滤器(卷积)的结果进行归一化 window。
在平滑掩码为0的区域(远离数据),我们将0除以0,因此需要特别注意。
请注意,归一化卷积也可用于不确定数据,其中蒙版图像的值介于 0 和 1 之间,表示我们对每个像素的置信度。例如,可以将被认为有噪声的像素设置为比其他像素更接近 0 的值。
上面的配方只对线性平滑滤波器有效。归一化卷积可以与其他线性滤波器一起完成,例如导数滤波器,但生成的配方不同。例如,参见 here 用于计算导数的归一化卷积方程。
对于非线性滤波器,其他方法是必要的。例如,非线性平滑滤波器通常会避免影响边缘,因此如果缺失像素设置为 0 或远离数据范围的某个值,则在缺失数据的图像中效果很好。保留指示哪些像素有数据而哪些像素没有数据的蒙版图像的概念始终是一个好主意。