fancwork commited on
Commit
f6d6527
·
verified ·
1 Parent(s): 2aec25c

Upload lab1_sky_detector.py

Browse files
Files changed (1) hide show
  1. 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)