import imageio from skimage import io import skimage import os from PIL import Image, ImageDraw, ImageFont, ImageOps import copy from datetime import date import numpy as np from argparse import ArgumentParser from skimage.transform import resize # import matplotlib.pyplot as plt import cv2 def color_map(m): return m[0] * np.array([1, 1, 1]) + (255 - m[0]) * np.array([0, 0, 1]) def createOverlay(image, front, zone, boundary): """ creates an image with the front label overlaying the glacier image :param image: Image of the glacier :param front: Image of the label of the front :return: an rgb image with the black and white image and red front line """ # value for NA area=0, stone=64, glacier=127, ocean with ice melange=254 image_rgb = np.array(image * 0.5, dtype=np.uint8) try: image_rgb[zone == 0] += np.array(np.array([0, 0, 0]) / 2, dtype=np.uint8) image_rgb[zone == 64] += np.array(np.array([52, 46, 55]) / 2, dtype=np.uint8) image_rgb[zone == 127] += np.array(np.array([254, 254, 254]) / 2, dtype=np.uint8) image_rgb[zone == 254] += np.array(np.array([60, 145, 230]) / 2, dtype=np.uint8) finally: #try: # image_rgb[boundary > 0] = np.array(np.array([241, 143, 1]), dtype=np.uint8) #finally: image_rgb[front == 255] = np.array(np.array([255, 0, 0]), dtype=np.uint8) return image_rgb def create_target(sar_image_path): sample_name = sar_image_path.split('/')[-1] sar_image = cv2.imread(sar_image_path) front_image_path = '/home/ho11laqe/PycharmProjects/data_raw/fronts_dilated_5/train/' + sample_name[ :-len('.png')] + '_front.png' zone_image_path = '/home/ho11laqe/PycharmProjects/data_raw/zones/train/' + sample_name[ :-len('.png')] + '_zones.png' boundary_image_path = '/home/ho11laqe/PycharmProjects/data_raw/boundaries_dilated_5/train/' + sample_name[ :-len( '.png')] + '_boundary.png' front = cv2.imread(front_image_path, cv2.IMREAD_GRAYSCALE) zone = cv2.imread(zone_image_path, cv2.IMREAD_GRAYSCALE) boundary = cv2.imread(boundary_image_path, cv2.IMREAD_GRAYSCALE) overlay = createOverlay(sar_image, front, zone, boundary) cv2.imwrite('output/target.png', cv2.cvtColor(overlay, cv2.COLOR_RGB2BGR)) if __name__ == '__main__': parser = ArgumentParser(add_help=False) parser.add_argument('--image_dir', help="Directory with predictions as png") args = parser.parse_args() image_dir = args.image_dir front_gif = [] fronts = [] zone_gif = [] zones = [] boundary_gif = [] boundaries = [] sar_image_path = '/home/ho11laqe/PycharmProjects/data_raw/sar_images/train/DBE_2008-03-30_TSX_7_3_049.png' sar_image = cv2.imread(sar_image_path) shape = sar_image.shape new_shape = (int(shape[1] / 4), int(shape[0] / 4)) sar_image = cv2.resize(sar_image, new_shape) create_target(sar_image_path) list_images = os.listdir(image_dir) list_images.sort(key=lambda y: int(y.split('_')[6])) for i, image_file in enumerate(list_images[:300]): epoch = image_file.split('_')[6] if image_file.endswith('_front.png'): print(image_file) front = cv2.imread(image_dir + '/' + image_file, cv2.IMREAD_GRAYSCALE) front = cv2.resize(front, new_shape, interpolation=cv2.INTER_NEAREST) # image = Image.fromarray(front) # image_draw = ImageDraw.Draw(image) # image_draw.text((1,1), 'Epoch: '+str(epoch)) # front_gif.append(image) fronts.append(front) elif image_file.endswith('_zone.png'): print(image_file) zone = cv2.imread(image_dir + '/' + image_file, cv2.IMREAD_GRAYSCALE) zone = cv2.resize(zone, new_shape, interpolation=cv2.INTER_NEAREST) # image = Image.fromarray(zone) # image_draw = ImageDraw.Draw(image) # image_draw.text((1, 1), 'Epoch: ' + str(epoch)) # zone_gif.append(image) zones.append(zone) elif image_file.endswith('_boundary.png'): print(image_file) boundary = cv2.imread(image_dir + '/' + image_file, cv2.IMREAD_GRAYSCALE) boundary = cv2.resize(boundary, new_shape, interpolation=cv2.INTER_NEAREST) # image = Image.fromarray(boundary) # image_draw = ImageDraw.Draw(image) # image_draw.text((1, 1), 'Epoch: ' + str(epoch)) # boundary_gif.append(image) boundaries.append(boundary) font = ImageFont.truetype("/usr/share/fonts/truetype/freefont/FreeMonoBold.ttf", 40) font_legend = ImageFont.truetype("/usr/share/fonts/truetype/freefont/FreeMonoBold.ttf", 20) overlay_gif = [] for epoch, (front, zone, boundary) in enumerate(zip(fronts, zones, boundaries)): overlay = createOverlay(sar_image, front, zone, boundary) image = Image.fromarray(overlay) image_draw = ImageDraw.Draw(image) image_draw.rectangle((0, 40, 195, 210), fill='gray') image_draw.rectangle((10, 60, 30, 80), fill=(60, 145, 230, 120)) image_draw.text((35, 60), 'Ocean', font=font_legend) image_draw.rectangle((10, 90, 30, 110), fill=(255, 255, 255)) image_draw.text((35, 90), 'Glacier', font=font_legend) image_draw.rectangle((10, 120, 30, 140), fill=(255, 0, 0)) image_draw.text((35, 120), 'Glacier Front', font=font_legend) image_draw.rectangle((10, 150, 30, 170), fill=(92, 76, 85)) image_draw.text((35, 150), 'Rock', font=font_legend) image_draw.rectangle((10, 180, 30, 200), fill=(0, 0, 0)) image_draw.text((35, 180), 'Shadow', font=font_legend) image_draw.rectangle((0, 0, 330, 45), fill='gray') image_draw.text((8, 1), 'Epoch:%03i' % epoch + '/' + str(len(fronts)), font=font, ) if epoch < 10: for i in range(10 - epoch): print(i) overlay_gif.append(image) else: overlay_gif.append(image) frame_one = overlay_gif[0] frame_one.save("output/overlay.gif", format="GIF", append_images=overlay_gif, save_all=True, duration=200, loop=0)