Source code for improutils.acquisition.img_io

import os
import re
import shutil

import cv2
import numpy as np
from natsort import natsorted


[docs] def load_image(file_path): """Load an image from a file. The function calls cv2.imread() to load image from the specified file and then return it. If the image cannot be read, the AssertError exception is thrown. For more info about formats, see cv2.imread() documentation Parameters ---------- file_path : string A path to an image file Returns ------- Loaded image in numpy.ndarray """ assert os.path.exists(file_path), "File does NOT exist! (" + file_path + ")" return cv2.imread(file_path)
[docs] def save_image(image, file_path): """Save an image to a file. The function calls cv2.imwrite() to save an image to the specified file. The image format is chosen based on the filename extension. Parameters ---------- image : numpy.ndarray Pixel values file_path : string A path to an image file Returns ------- True if image is saved successfully """ return cv2.imwrite(file_path, image)
[docs] def copy_to(src, dst, mask): """Copy source image pixel to destination image using mask matrix. This function is Python alternative to C++/Java OpenCV's Mat.copyTo(). More: https://docs.opencv.org/trunk/d3/d63/classcv_1_1Mat.html#a626fe5f96d02525e2604d2ad46dd574f Parameters ---------- src : numpy.ndarray Source image dst : numpy.ndarray Destination image mask : numpy.ndarray Binary image that specifies which pixels are copied. Value 1 means true Returns ------- Destination image with copied pixels from source image """ locs = np.where(mask != 0) # Get the non-zero mask locations dst[locs[0], locs[1]] = src[locs[0], locs[1]] return dst
[docs] def reindex_image_files(source_dir, output_dir=None): """Read all images in source_dir and rename them to continuous integers. Based on their original order, changes their filenames to be continuous integers (starting from 0). Then, they can be easily read by cv2.VideoCapture. Image format is kept. Parameters ---------- source_dir : string Input images directory that have to be renamed. output_dir : Optional[string] Output directory for renamed files. If not specified, renaming is done inplace in source_dir. Returns ------- None """ input_files = [] for file in os.listdir(source_dir): if re.match(r".*(\.bmp|\.jpg|\.png|\.gif)$", file, re.I): input_files.append(os.path.join(source_dir, file)) if not input_files: print("No files were found.") return extension = "." + input_files[0].split(".")[-1] if output_dir is None: for i, filename in enumerate(natsorted(input_files)): os.rename(filename, os.path.join(source_dir, str(i) + extension)) print( f"Files within {source_dir} were renamed, starting from 0{extension} to {i}{extension}." ) else: if not os.path.isdir(output_dir): os.mkdir(output_dir) for i, filename in enumerate(natsorted(input_files)): shutil.copy(filename, os.path.join(output_dir, str(i) + extension)) print( f"Files from {source_dir} were renamed and saved to {output_dir}, starting from 0{extension} to {i}{extension}." )