[英]Python: Change color of bad pixels
我有一個包含衛星數據的 HDF 文件,繪制時看起來像下面的附件圖像。 它有很多壞像素(使用這個特定的顏色圖時它們會變成黑色)。 例如,如何將壞像素的顏色更改為白色? 謝謝你。
HDF 文件鏈接: https://drive.google.com/file/d/1AYhvqxNlvlqQB7otn_veLkO3t2qPogV_/view?usp=sharing
這是生成圖像的簡化代碼:
import h5py
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
filename = 'NmHRIR1H.19660626_14-57-45_564_005.hdf'
with h5py.File(filename) as f:
temp = f['HRIR-Temp'][:]-273.15 # Convert K to C
lat = f['latitude'][:]
lon = f['longitude'][:]
f.close()
fig = plt.figure(figsize=(8,8))
ax = plt.axes(projection=ccrs.Mercator())
extent = [124,139,12,27]
ax.set_extent(extent, crs=ccrs.PlateCarree())
ax.coastlines(resolution='10m', color='gold', linewidth=0.5)
ax.pcolormesh(lon, lat, temp, cmap='binary', vmin=-60, vmax=40, transform=ccrs.PlateCarree())
plt.show()
更新:我再次檢查了這個數據集的文檔,它有一個名為“Flags”的字段,其中存儲了位標志。 特別是第 4 位似乎是我實現我想要的目標的關鍵(當第 4 位打開時,這意味着數據錯誤)。
Flags 的值似乎永遠不會高於 3,所以我認為這不會幫助您解決這個特定問題。 我沒有看到任何指定 nodata 值的屬性,也沒有看到提到它的文檔,但很明顯最大 float32 值用於此。
條帶外的坐標填充有該值,以及溫度中的極低 (?) 值。
正如@Michael Delgado 已經提到的, cmap.set_bad()
是為這些值分配特定顏色(或 alpha)的好方法。 但它需要 Matplotlib 才能知道什么是“壞”,在當前形式中,您可以使用cmap.set_over()
但這將失去與被剪裁的有效值的區別( temp > vmax
)。
通常最好從文件的元數據中解析出一個 nodata 值,但我沒有立即看到它(沒那么仔細看)。 硬編碼時:
import h5py
import numpy as np
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import matplotlib as mpl
fn = 'NmHRIR1H.19660626_14-57-45_564_005.hdf'
nodata_value = np.finfo(np.float32).max
with h5py.File(fn) as f:
temp = np.ma.masked_values(f['HRIR-Temp'][:], nodata_value) - 273.15
lat = np.ma.masked_values(f['latitude'][:], nodata_value)
lon = np.ma.masked_values(f['longitude'][:], nodata_value)
cmap = mpl.colormaps["binary"].copy()
cmap.set_bad("r", alpha=1)
norm = mpl.colors.Normalize(vmin=-60, vmax=40)
fig, ax = plt.subplots(
figsize=(6,6), dpi=86, facecolor="w", layout="compressed",
subplot_kw=dict(projection=ccrs.PlateCarree()),
)
im = ax.pcolormesh(lon, lat, temp, cmap=cmap, norm=norm)
cb = fig.colorbar(im, ax=ax, shrink=.5, extend="both")
ax.coastlines(resolution='10m', color='gold', linewidth=0.5)
extent = [124,139,12,27]
ax.set_extent(extent, crs=ccrs.PlateCarree())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.