HyperVision / hyperspectral_image_reader /read_dataset_image.py
IronKitty's picture
Upload folder using huggingface_hub
d9375f3 verified
Raw
History Blame Contribute Delete
5.15 kB
import os
import sys
import argparse
import numpy as np
# Ensure workspace is in python path to allow importing configs
current_dir = os.path.abspath(os.path.dirname(__file__))
parent_dir = os.path.abspath(os.path.join(current_dir, '..'))
if current_dir not in sys.path:
sys.path.append(current_dir)
if parent_dir not in sys.path:
sys.path.append(parent_dir)
try:
from hyperspectral_pipelines import LoadHyperspectralImage
except ImportError as e:
print(f"Error: Could not import LoadHyperspectralImage. Detail: {e}")
sys.exit(1)
DATASET_EXTENSIONS = {
# .mat / .h5 formats
'harvard': '.mat', 'umld2015': '.mat', 'umns2002': '.mat', 'umns2004': '.mat',
'umos': '.mat', 'umri2015': '.mat', 'umemm': '.mat', 'hyperblood': '.mat',
'arad_1k_31': '.mat', 'arad_1k_16': '.mat', 'cave': '.mat', 'fiftyoutdoor': '.mat',
'icvl': '.h5', 'hs_sod': '.h5', 'hsodbitv2': '.mat',
# .npy / .npz formats
'hsidrive20': '.npy', 'aphid': '.npy',
'hyperdrive': '.npz', 'hyperdrivevnir': '.npz', 'hyperdriveswir': '.npz',
# ENVI formats (requires .hdr + raw file, pass the .hdr file path)
'libhsi': '.hdr', 'virginia_tech_tree': '.hdr', 'vnihdhiatlimafb': '.hdr',
# ENVI formats (with .bin, requires .hdr + .bin, pass the .bin file path)
'deephsnir': '.bin', 'deephsvis': '.bin', 'deephsviscor': '.bin',
# Image formats
'hotvis': '.png', 'hotnir': '.png', 'hotrednir': '.png',
'hsiroad': '.tif',
# Custom format
'hyperspectralcityv2': '.hsd',
}
def load_hypervision_matrix(file_path, dataset_name):
"""
Loads a hyperspectral image and processes it into the exact matrix shape and scale
expected by the HyperVision / HyperFree models.
Args:
file_path (str): Path to the image file.
dataset_name (str): Name of the dataset (e.g., 'harvard', 'arad_1k_31', etc.).
Returns:
np.ndarray: Processed matrix of shape (H_ori, W_ori, C_hsi) scaled to [0, 255].
"""
if not os.path.exists(file_path):
raise FileNotFoundError(f"Image path not found: {file_path}")
# Validate file extension
_, ext = os.path.splitext(file_path)
expected_ext = DATASET_EXTENSIONS.get(dataset_name)
if expected_ext and ext.lower() != expected_ext.lower():
print(f"Warning: Expected file extension '{expected_ext}' for dataset '{dataset_name}', but got '{ext}'.")
if expected_ext == '.hdr':
print("Note: ENVI datasets require both the header (.hdr) and the raw binary data file. Please pass the path to the .hdr file.")
elif expected_ext == '.bin':
print("Note: DeepHS datasets require both the binary data (.bin) and the header (.hdr) file. Please pass the path to the .bin file.")
elif expected_ext in ['.mat', '.h5']:
print("Note: This dataset requires a MATLAB (.mat) or HDF5 (.h5) formatted cube.")
elif expected_ext == '.npz':
print("Note: This dataset requires a NumPy compressed archive (.npz) containing 'cube.npy'.")
print()
# Initialize the dataset loader pipeline
loader = LoadHyperspectralImage(dataset_type=dataset_name, to_float32=True, append_rgb=True)
# Run the transform
results = {'img_path': file_path}
results = loader(results)
img = results['img'] # Loaded image of shape (H, W, C)
# Check if the loaded image contains appended RGB channels.
# The cache image might contain RGB (C = bands + 3), while the raw HSI might not (C = bands).
num_hsi_channels = loader.bands
actual_channels = img.shape[2]
if actual_channels > num_hsi_channels:
# Strip the last 3 channels (the appended RGB bands)
img = img[:, :, :num_hsi_channels]
# Min-Max normalization per image sample to [0, 255]
hsi_min = img.min()
hsi_max = img.max()
if hsi_max > hsi_min:
processed_matrix = 255.0 * (img - hsi_min) / (hsi_max - hsi_min)
else:
processed_matrix = np.zeros_like(img)
return processed_matrix
if __name__ == '__main__':
parser = argparse.ArgumentParser(description="Read HSI dataset image and output the matrix processed for HyperVision.")
parser.add_argument('--path', type=str, required=True, help="Path to the HSI image file.")
parser.add_argument('--dataset', type=str, required=True, help="Dataset name (e.g. harvard, arad_1k_31, icvl, etc.).")
parser.add_argument('--output', type=str, default=None, help="Optional path to save the output matrix as a .npy file.")
args = parser.parse_args()
try:
matrix = load_hypervision_matrix(args.path, args.dataset)
print("\nSuccessfully loaded and processed HSI image.")
print(f"Matrix shape (H, W, C): {matrix.shape}")
print(f"Value range: [{matrix.min():.2f}, {matrix.max():.2f}]")
print(f"Data type: {matrix.dtype}")
if args.output:
np.save(args.output, matrix)
print(f"Saved processed matrix to: {args.output}")
except Exception as e:
print(f"Error during execution: {e}")
sys.exit(1)