Python: 创建一个未知形状的面具

Python: create a mask with unknown shape

我正在尝试提取具有 "unknown" 形状的遮罩。我要更好地解释我自己:

我的原始数据由一个包含 NaN 的矩阵组成,它或多或少地围绕着真实数据。我使用了 sobel 算子来检测边缘:

#data is a matrix with Nan
mask = np.isnan(data)
data[mask] = 0
data[~mask] = 1 
out = sobel(data) #sobel is a function that returns the gradient

图中报告了sobel操作的输出。由于原始数据在真实数据中也有 NaN,所以 sobel 算子检测内边缘。 我想尝试一种只检测外边缘的方法(看起来像菱形的图形)。考虑到不仅这个形状可以变化(它可以是正方形或矩形),而且位置也可以变化(即可以偏心,或者相对于图像尺寸非常小)。我将获得的结果应该是所有外部像素都设置为 True(或 False),而所有内部像素都设置为 False(或 True)的蒙版。

谢谢!

一种可能的部分解决方案是使用 opening 操作,定义为腐蚀后膨胀。我使用了 skimage:

提供的那个
from skimage.morphology import opening
#data has shape shape_1, shape_2
mask_data = np.ones((shape_1, shape_2), dtype=bool)
mask = np.isnan(data)
mask_data[_mask] = 0
mask_data = opening(mask_data).astype(bool)

这种方法 returns 与我正在寻找的类似。如图所示,这实际上留下了一些黑色的内点,但这是我找到的最好的。