# -*- coding: utf-8 -*- """lab1_sky_detector.ipynb Automatically generated by Colaboratory. Original file is located at https://colab.research.google.com/drive/1fbwiWdURCSaRB3fbSs0gF88hiFqpJhC1 """ #!pip install gradio import gradio as gr #from google.colab import files import cv2 import numpy as np #from matplotlib import pyplot as plt #from scipy.signal import medfilt # upload input image (in Google Colab environment) #def upload_image(): # uploaded = files.upload() # file = next(iter(uploaded)) # img = cv2.imread(file) # return img # display input image (in Google Colab environment) #def display_image(img, title="Image"): # img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # convert from BGR to RGB for OpenCV # plt.imshow(img_rgb) # plt.title(title) # plt.axis("off") # plt.show() # convert input image to grayscale to prepare for edge detection def convert_to_grayscale(img): img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) return img_gray # use Gaussian blurring to reduce noise def apply_blur(img_gray): img_blurred = cv2.blur(img_gray, (3, 3)) return img_blurred # use Laplacian gradient to detect edges def calculate_gradient(img_blurred, threshold=9): laplacian = cv2.Laplacian(img_blurred, cv2.CV_8U) gradient_mask = (laplacian < threshold).astype(np.uint8) return gradient_mask # use morphological erosion to refine the mask def refine_mask_morphological(gradient_mask): kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) mask = cv2.morphologyEx(gradient_mask, cv2.MORPH_ERODE, kernel) # skyline_mask = cal_skyline(eroded_mask) return mask # apply the mask to isolate the sky #def cal_skyline(mask): # h, w = mask.shape # for i in range(w): # column = mask[:, i] # after_median = medfilt(column, kernel_size=21) # try: # first_white_index = np.where(after_median == 1)[0][0] # first_black_index = np.where(after_median == 0)[0][0] # if first_black_index > first_white_index: # mask[:first_black_index, i] = 1 # mask[first_black_index:, i] = 0 # except IndexError: # continue # return mask # use median blur to refine the mask def refine_mask_median(mask): h, w = mask.shape mask_blurred = cv2.medianBlur(mask, 9) for i in range(w): median = mask_blurred[:, i] try: first_white_index = np.where(median == 0)[0][0] first_black_index = np.where(median == 1)[0][0] if first_white_index > 20: mask[first_black_index:first_white_index, i] = 1 mask[first_white_index:, i] = 0 mask[:first_black_index, i] = 0 except: continue return mask # extract sky region by applying the mask def get_sky_region(img, mask): sky_region = cv2.bitwise_and(img, img, mask=mask) return sky_region # run in order and show the detected sky region #def sky_detector(img): # display_image(img, "Original Image") # img_blurred = convert_to_grayscale_and_blur(img) # gradient_mask = calculate_gradient(img_blurred) # skyline_mask = refine_skyline(gradient_mask) # sky_region = get_sky_region(img, skyline_mask) # display_image(sky_region, "Sky Region") # main #image = upload_image() #sky_detector(image) # run in order for Gardio def sky_detector(img): img_gray = convert_to_grayscale(img) img_blurred = apply_blur(img_gray) gradient_mask = calculate_gradient(img_blurred) mask = refine_mask_morphological(gradient_mask) mask = refine_mask_median(mask) sky_region = get_sky_region(img, mask) # sky_region_rgb = cv2.cvtColor(sky_region, cv2.COLOR_BGR2RGB) return sky_region # set up Gardio interface interface = gr.Interface( fn=sky_detector, inputs="image", outputs="image", title="Sky Detector", live=True ) interface.launch(share=True, debug=True)