Spaces:
Sleeping
Sleeping
Upload lab1_sky_detector.py
Browse files- lab1_sky_detector.py +98 -0
lab1_sky_detector.py
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# -*- coding: utf-8 -*-
|
| 2 |
+
"""lab1_sky_detector.ipynb
|
| 3 |
+
|
| 4 |
+
Automatically generated by Colaboratory.
|
| 5 |
+
|
| 6 |
+
Original file is located at
|
| 7 |
+
https://colab.research.google.com/drive/1fbwiWdURCSaRB3fbSs0gF88hiFqpJhC1
|
| 8 |
+
"""
|
| 9 |
+
|
| 10 |
+
!pip install gradio
|
| 11 |
+
|
| 12 |
+
import gradio as gr
|
| 13 |
+
#from google.colab import files
|
| 14 |
+
import cv2
|
| 15 |
+
import numpy as np
|
| 16 |
+
from matplotlib import pyplot as plt
|
| 17 |
+
from scipy.signal import medfilt
|
| 18 |
+
|
| 19 |
+
# upload input image
|
| 20 |
+
#def upload_image():
|
| 21 |
+
# uploaded = files.upload()
|
| 22 |
+
# file = next(iter(uploaded))
|
| 23 |
+
# img = cv2.imread(file)
|
| 24 |
+
# return img
|
| 25 |
+
|
| 26 |
+
# display input image
|
| 27 |
+
#def display_image(img, title="Image"):
|
| 28 |
+
# img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # convert from BGR to RGB for OpenCV
|
| 29 |
+
# plt.imshow(img_rgb)
|
| 30 |
+
# plt.title(title)
|
| 31 |
+
# plt.axis("off")
|
| 32 |
+
# plt.show()
|
| 33 |
+
|
| 34 |
+
# convert input image to grayscale to prepare for edge detection
|
| 35 |
+
def convert_to_grayscale_and_blur(img):
|
| 36 |
+
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
| 37 |
+
img_blurred = cv2.blur(img_gray, (5, 5)) # Gaussian blurring with a kernel size of (9, 3) to reduce noise
|
| 38 |
+
return img_blurred
|
| 39 |
+
|
| 40 |
+
# detect edges using Laplacian filter
|
| 41 |
+
def calculate_gradient(img_blurred, threshold=7):
|
| 42 |
+
laplacian = cv2.Laplacian(img_blurred, cv2.CV_8U)
|
| 43 |
+
gradient_mask = (laplacian < threshold).astype(np.uint8)
|
| 44 |
+
return gradient_mask
|
| 45 |
+
|
| 46 |
+
# refine skyline using median filtering and morphological operation
|
| 47 |
+
def refine_skyline(mask):
|
| 48 |
+
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
|
| 49 |
+
eroded_mask = cv2.morphologyEx(mask, cv2.MORPH_ERODE, kernel)
|
| 50 |
+
skyline_mask = cal_skyline(eroded_mask)
|
| 51 |
+
return skyline_mask
|
| 52 |
+
|
| 53 |
+
# adjust skyline using median filtering to isolate the sky
|
| 54 |
+
def cal_skyline(mask):
|
| 55 |
+
h, w = mask.shape
|
| 56 |
+
for i in range(w):
|
| 57 |
+
column = mask[:, i]
|
| 58 |
+
after_median = medfilt(column, kernel_size=21)
|
| 59 |
+
try:
|
| 60 |
+
first_white_index = np.where(after_median == 1)[0][0]
|
| 61 |
+
first_black_index = np.where(after_median == 0)[0][0]
|
| 62 |
+
if first_black_index > first_white_index:
|
| 63 |
+
mask[:first_black_index, i] = 1
|
| 64 |
+
mask[first_black_index:, i] = 0
|
| 65 |
+
except IndexError:
|
| 66 |
+
continue
|
| 67 |
+
return mask
|
| 68 |
+
|
| 69 |
+
# extract sky region by applying the mask
|
| 70 |
+
def get_sky_region(img, mask):
|
| 71 |
+
sky_region = cv2.bitwise_and(img, img, mask=mask)
|
| 72 |
+
return sky_region
|
| 73 |
+
|
| 74 |
+
# run in order and show the detected sky region
|
| 75 |
+
#def sky_detector(img):
|
| 76 |
+
# display_image(img, "Original Image")
|
| 77 |
+
# img_blurred = convert_to_grayscale_and_blur(img)
|
| 78 |
+
# gradient_mask = calculate_gradient(img_blurred)
|
| 79 |
+
# skyline_mask = refine_skyline(gradient_mask)
|
| 80 |
+
# sky_region = get_sky_region(img, skyline_mask)
|
| 81 |
+
# display_image(sky_region, "Sky Region")
|
| 82 |
+
|
| 83 |
+
# main
|
| 84 |
+
#image = upload_image()
|
| 85 |
+
#sky_detector(image)
|
| 86 |
+
|
| 87 |
+
# run in order for Gardio
|
| 88 |
+
def sky_detection(image):
|
| 89 |
+
img_blurred = convert_to_grayscale_and_blur(image)
|
| 90 |
+
gradient_mask = calculate_gradient(img_blurred)
|
| 91 |
+
skyline_mask = refine_skyline(gradient_mask)
|
| 92 |
+
sky_region = get_sky_region(image, skyline_mask)
|
| 93 |
+
sky_region_rgb = cv2.cvtColor(sky_region, cv2.COLOR_BGR2RGB) # Convert to RGB for Gradio display
|
| 94 |
+
return sky_region_rgb
|
| 95 |
+
|
| 96 |
+
# set up Gardio interface
|
| 97 |
+
interface = gr.Interface(fn=sky_detection, inputs=gr.Image(), outputs="image")
|
| 98 |
+
interface.launch(share=True)
|