簡體   English   中英

Python:更改壞像素的顏色

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM