我有一张我需要根据另一张图片进行遮罩的图像。也就是说,要从单色图像文件(不是具有简单形状的小阵列)读取掩模并将其应用于另一图像。我需要计算半径为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()。 看起来它会起作用吗?