IronKitty's picture
Update hyperspectral image reader imports, add utils, and update README for Hugging Face
21aecfa verified
Raw History Blame Contribute Delete
3.92 kB
import os
import os.path
import torch
import numpy as np
import pandas
from glob import glob
import random
from collections import OrderedDict
import cv2
import numpy as np
def X2Cube(img, cellSize=4):
B = [cellSize, cellSize]
skip = [cellSize, cellSize]
# Parameters
M, N = img.shape
col_extent = N - B[1] + 1
row_extent = M - B[0] + 1
# Get Starting block indices
start_idx = np.arange(B[0])[:, None] * N + np.arange(B[1])
# Generate Depth indeces
didx = M * N * np.arange(1)
start_idx = (didx[:, None] + start_idx.ravel()).reshape((-1, B[0], B[1]))
# Get offsetted indices across the height and width of input array
offset_idx = np.arange(row_extent)[:, None] * N + np.arange(col_extent)
# Get all actual indices & index into input array for final output
out = np.take(img, start_idx.ravel()[:, None] + offset_idx[::skip[0], ::skip[1]].ravel())
out = np.transpose(out)
DataCube = out.reshape(M//cellSize, N//cellSize, cellSize*cellSize)
hsi_min = np.min(DataCube, axis=(0,1), keepdims=True)
hsi_max = np.max(DataCube, axis=(0,1), keepdims=True)
hsi_normed = (DataCube - hsi_min) / ((hsi_max - hsi_min) + 1e-6) * 255
hsi_normed = hsi_normed.astype(np.uint8)
return hsi_normed
def X2Cube_fast(img, cellSize=4):
M, N = img.shape
if (M % cellSize) != 0 or (N % cellSize) != 0:
raise ValueError(f"Image shape {(M, N)} must be divisible by cellSize {cellSize}")
cubes = (
img.reshape(M // cellSize, cellSize, N // cellSize, cellSize)
.swapaxes(1, 2)
.reshape(M // cellSize, N // cellSize, cellSize * cellSize)
)
hsi_min = np.min(cubes, axis=(0, 1), keepdims=True)
hsi_max = np.max(cubes, axis=(0, 1), keepdims=True)
hsi_normed = (cubes - hsi_min) / ((hsi_max - hsi_min) + 1e-6) * 255
return hsi_normed.astype(np.uint8)
def get_image_loader(img_file: str, cellSize=-1) -> np.array:
if cellSize > 0:
img = cv2.imread(img_file, cv2.IMREAD_ANYCOLOR | cv2.IMREAD_ANYDEPTH)
img = X2Cube(img, cellSize)
elif cellSize == -1:
img = cv2.imread(img_file, cv2.IMREAD_COLOR)
else:
raise Exception
return img
def _get_frames(self, seq_id, frame_ids):
frame_list = []
for frame_id in frame_ids:
frame_name = '%04d.png' % (frame_id+1)
image_path = os.path.join(self.RGBHDataRootDir, self.sequence_list[seq_id], 'img', frame_name)
if self.cur_modalName == 'NIR':
hsi_image = self.get_image_loader(image_path, cellSize=5)
elif self.cur_modalName == 'VIS':
hsi_image = self.get_image_loader(image_path, cellSize=4)
elif self.cur_modalName == 'RedNIR':
hsi_image = self.get_image_loader(image_path, cellSize=4)
hsi_image = hsi_image[:,:,:-1]
frame_name = '%04d.jpg' % (frame_id+1)
image_path = os.path.join(self.RGBHDataRootDir.replace('HSI-'+self.cur_modalName, 'HSI-'+self.cur_modalName+'-FalseColor'), self.sequence_list[seq_id], 'img', frame_name)
hsi_fc_image = self.get_image_loader(image_path, cellSize=-1)
frame_list.append(np.concatenate((hsi_fc_image, hsi_image), axis=2))
return frame_list
def get_frames(self, seq_id, frame_ids, anno=None):
frame_list = self._get_frames(seq_id, frame_ids)
if anno is None:
anno = self.get_sequence_info(seq_id)
anno_frames = {}
for key, value in anno.items():
if key == 'seq_belong_mask':
continue
anno_frames[key] = [value[f_id, ...].clone() for f_id in frame_ids]
object_meta = OrderedDict({'object_class_name': None,
'motion_class': None,
'major_class': None,
'root_class': None,
'motion_adverb': None})
return frame_list, anno_frames, object_meta