Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Gaussian Filter รูปภาพที่มีค่า NaN ใน Python Matplotlib


ภาพรวม

การใช้ Gaussian Filter บนภาพที่มีค่า NaN จะทำให้ค่าทั้งหมดกลายเป็น NaN (เพราะ NaN กระจายไปทั่ว Kernel)

ขั้นตอน

  1. สร้าง Figure และ Subplots (2 แถว)
  2. สร้าง Matrix 4x4 มีค่า NaN ปนอยู่
  3. แสดงภาพต้นฉบับด้วย imshow()
  4. ใช้ scipy.ndimage.gaussian_filter กรองภาพ
  5. แสดงภาพหลังกรอง

ตัวอย่างโค้ด

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