Spaces:
Sleeping
Sleeping
| import os | |
| from glob import glob | |
| from pathlib import Path | |
| from natsort import natsorted | |
| from PIL import Image | |
| import numpy as np | |
| import tifffile | |
| import skimage.io as io | |
| import torchvision.transforms as T | |
| import cv2 | |
| from tqdm import tqdm | |
| from models.tra_post_model.trackastra.utils import normalize_01, normalize | |
| IMG_SIZE = 512 | |
| def _load_tiffs(folder: Path, dtype=None): | |
| """Load a sequence of tiff files from a folder into a 3D numpy array.""" | |
| images = glob(str(folder / "*.tif")) | |
| test_data = tifffile.imread(images[0]) | |
| if len(test_data.shape) == 3: | |
| turn_gray = True | |
| else: | |
| turn_gray = False | |
| end_frame = len(images) | |
| if not turn_gray: | |
| x = np.stack([ | |
| tifffile.imread(f).astype(dtype) | |
| for f in tqdm( | |
| sorted(folder.glob("*.tif"))[0 : end_frame : 1], | |
| leave=False, | |
| desc=f"Loading [0:{end_frame}]", | |
| ) | |
| ]) | |
| else: | |
| x = [] | |
| for f in tqdm( | |
| sorted(folder.glob("*.tif"))[0 : end_frame : 1], | |
| leave=False, | |
| desc=f"Loading [0:{end_frame}]", | |
| ): | |
| img = tifffile.imread(f).astype(dtype) | |
| if img.ndim == 3: | |
| if img.shape[-1] > 3: | |
| img = img[..., :3] | |
| img = (0.299 * img[..., 0] + 0.587 * img[..., 1] + 0.114 * img[..., 2]) | |
| x.append(img) | |
| x = np.stack(x) | |
| return x | |
| def load_track_images(file_dir): | |
| # suffix_ = [".png", ".tif", ".tiff", ".jpg"] | |
| def find_tif_dir(root_dir): | |
| """递归查找.tif 文件""" | |
| tif_files = [] | |
| for dirpath, _, filenames in os.walk(root_dir): | |
| if '__MACOSX' in dirpath: | |
| continue | |
| for f in filenames: | |
| if f.lower().endswith('.tif'): | |
| tif_files.append(os.path.join(dirpath, f)) | |
| return tif_files | |
| tif_dir = find_tif_dir(file_dir) | |
| print(f"Found {len(tif_dir)} tif images in {file_dir}") | |
| print(f"First 5 tif images: {tif_dir[:5]}") | |
| assert len(tif_dir) > 0, f"No tif images found in {file_dir}" | |
| images = natsorted(tif_dir) | |
| imgs = [] | |
| imgs_raw = [] | |
| images_stable = [] | |
| # load images for seg and track | |
| for img_path in tqdm(images, desc="Loading images"): | |
| img = tifffile.imread(img_path) | |
| img_raw = io.imread(img_path) | |
| if img.dtype == 'uint16': | |
| img = ((img - img.min()) / (img.max() - img.min() + 1e-6) * 255).astype(np.uint8) | |
| img = np.stack([img] * 3, axis=-1) | |
| w, h = img.shape[1], img.shape[0] | |
| else: | |
| img = Image.open(img_path).convert("RGB") | |
| w, h = img.size | |
| img = T.Compose([ | |
| T.ToTensor(), | |
| T.Resize((IMG_SIZE, IMG_SIZE)), | |
| ])(img) | |
| image_stable = img - 0.5 | |
| img = T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])(img) | |
| imgs.append(img) | |
| imgs_raw.append(img_raw) | |
| images_stable.append(image_stable) | |
| height = h | |
| width = w | |
| imgs = np.stack(imgs, axis=0) | |
| imgs_raw = np.stack(imgs_raw, axis=0) | |
| images_stable = np.stack(images_stable, axis=0) | |
| # track data | |
| imgs_ = _load_tiffs(Path(file_dir), dtype=np.float32) | |
| imgs_01 = np.stack([ | |
| normalize_01(_x) for _x in tqdm(imgs_, desc="Normalizing", leave=False) | |
| ]) | |
| imgs_ = np.stack([ | |
| normalize(_x) for _x in tqdm(imgs_, desc="Normalizing", leave=False) | |
| ]) | |
| return imgs, imgs_raw, images_stable, imgs_, imgs_01, height, width | |
| if __name__ == "__main__": | |
| file_dir = "data/2D+Time/DIC-C2DH-HeLa/train/DIC-C2DH-HeLa/02" | |
| imgs, imgs_raw, images_stable, imgs_, imgs_01, height, width = load_track_images(file_dir) | |
| print(imgs.shape, imgs_raw.shape, images_stable.shape, imgs_.shape, imgs_01.shape, height, width) |