ภาพรวม
การใช้ Gaussian Filter บนภาพที่มีค่า NaN จะทำให้ค่าทั้งหมดกลายเป็น NaN (เพราะ NaN กระจายไปทั่ว Kernel)
ขั้นตอน
- สร้าง Figure และ Subplots (2 แถว)
- สร้าง Matrix 4x4 มีค่า NaN ปนอยู่
- แสดงภาพต้นฉบับด้วย
imshow() - ใช้
scipy.ndimage.gaussian_filterกรองภาพ - แสดงภาพหลังกรอง
ตัวอย่างโค้ด
import numpy as np
from matplotlib import pyplot as plt
from scipy.ndimage import gaussian_filter
plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True
fig, axes = plt.subplots(2)
data = np.array([[1., 1.2, 0.89, np.nan],
[1.2, np.nan, 1.89, 2.09],
[.78, .67, np.nan, 1.78],
[np.nan, 1.56, 1.89, 2.78]])
axes[0].imshow(data, cmap="cubehelix_r")
axes[0].set_title("Original (with NaN)")
gaussian_filter_data = gaussian_filter(data, sigma=1)
axes[1].imshow(gaussian_filter_data, cmap="cubehelix_r")
axes[1].set_title("After Gaussian Filter (all NaN)")
plt.show()
ผลลัพธ์
ภาพหลัง Gaussian Filter ทั้งหมดกลายเป็น NaN (แสดงเป็นสีเดียว/ว่าง)
วิธีแก้ไข
- เติมค่า NaN ก่อนกรอง (Inpainting/Interpolation)
- ใช้
scipy.ndimage.gaussian_filterกับmode='constant', cval=0แต่ยังมีปัญหา - แนะนำใช้
astropy.convolution.Gaussian2DKernelรองรับ NaN