图像中的蒙版数组

时间:2017-08-01 23:22:35

标签: python arrays mask

我有一张我需要根据另一张图片进行遮罩的图像。也就是说,要从单色图像文件(不是具有简单形状的小阵列)读取掩模并将其应用于另一图像。我需要计算半径为25像素的蒙版图像的中位数。我一直在玩http://prancer.physics.louisville.edu/astrowiki/index.php/Image_processing_with_Python_and_SciPy#Masked_image_operations的建议 但是我无法看到如何将掩模一次应用到25像素半径的补丁。每个图像文件都是901 x 877像素。

我考虑过将掩码中的值堆叠到图像数组的另一个维度上,并使用if ... then循环来查看数组中的像素,同时查看图像中的像素,但这似乎是就像一种非常低效的方式。 这是我用于修补程序的代码:

import numpy as np
def patch_filter(image_data, radius):
    kernel = np.zeros((2*radius+1, 2*radius+1))
    y, x = np.ogrid[-radius:radius+1, -radius:radius+1]
    mask = x**2 + y**2 <= radius**2
    kernel[mask] = 1                
    filtered_image = gf(image_data, np.median, footprint = kernel)
    return filtered_image

这样可以在图像未被遮罩时正常工作。 有关将蒙版应用于图像的想法吗?

编辑: 以下是我的想法:

import matplotlib.pyplot as plt
import numpy as np
from astropy.io import fits
from scipy.ndimage.filters import generic_filter as gf

#   Read images into arrays
hdulist = fits.open('xbulge-w1.fits')
w1data = hdulist[0].data               # This is the image

hdulistmask = fits.open('xbulge-mask.fits')
maskdata = hdulistmask[0].data         # This is the mask

#   Define physical shape of filter
def patch_filter(image_data, radius):
    kernel = np.zeros((2*radius+1, 2*radius+1))
    y, x = np.ogrid[-radius:radius+1, -radius:radius+1]
    patch = x**2 + y**2 <= radius**2
    kernel[patch] = 1                
    filtered_image = gf(image_data, np.median, footprint = kernel)
    return filtered_image

mx1 = np.ma.masked_array(w1data, mask=maskdata)

radius = 25

w1masked_filtered = patch_filter(mx1, radius)

然后我要么plt.show()或plt.savefig()。 看起来它会起作用吗?

0 个答案:

没有答案