CSB261 commited on
Commit
c9a5131
ยท
verified ยท
1 Parent(s): 8cf5f12

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +99 -229
app.py CHANGED
@@ -1,245 +1,115 @@
1
  import gradio as gr
 
2
  import numpy as np
3
- from PIL import Image, ImageOps, ImageEnhance, ImageFilter
4
- from skimage.restoration import denoise_nl_means, estimate_sigma
5
- import io
6
-
7
- def process_image(
8
- img,
9
- denoise_strength,
10
- sharpen_strength,
11
- gamma,
12
- brightness,
13
- contrast,
14
- saturation
15
- ):
16
- """
17
- ์—…๋กœ๋“œ๋œ ์ด๋ฏธ์ง€๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ(๋…ธ์ด์ฆˆ ์ œ๊ฑฐ, ์ƒคํ”„๋‹, ๊ฐ๋งˆ ๋ณด์ •, ๋ฐ๊ธฐ, ๋Œ€๋น„, ์ฑ„๋„)์— ๋”ฐ๋ผ
18
- ์ตœ์ข…์ ์œผ๋กœ ํ‘๋ฐฑ ์‚ฌ์ง„์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
19
- """
20
- # ํ˜น์‹œ ๋ชจ๋ฅผ Alpha ์ฑ„๋„ ๋ฌธ์ œ ๋ฐฉ์ง€ (4์ฑ„๋„ -> 3์ฑ„๋„)
21
- img = img.convert("RGB") # RGBA์ธ ๊ฒฝ์šฐ์—๋„ RGB๋กœ ๊ฐ•์ œ ๋ณ€ํ™˜
22
-
23
- # Pillow Image -> Numpy array ๋ณ€ํ™˜
24
- img_np = np.array(img)
25
-
26
- # ================ 1. ๋…ธ์ด์ฆˆ ์ œ๊ฑฐ ================
27
- # ์ด๋ฏธ์ง€๊ฐ€ RGB(3์ฐจ์›)์ธ์ง€, ํ‘๋ฐฑ(2์ฐจ์›)์ธ์ง€ ํŒ๋ณ„
28
- if len(img_np.shape) == 3:
29
- # RGB ์ด๋ฏธ์ง€์˜ ๊ฒฝ์šฐ channel_axis=-1
30
- sigma_est = np.mean(estimate_sigma(img_np, channel_axis=-1))
31
- denoised = denoise_nl_means(
32
- img_np,
33
- h=denoise_strength * sigma_est,
34
- patch_size=5,
35
- patch_distance=3,
36
- channel_axis=-1,
37
- fast_mode=True
38
- )
39
- else:
40
- # ํ‘๋ฐฑ(2์ฐจ์›) ์ด๋ฏธ์ง€์ธ ๊ฒฝ์šฐ channel_axis=None
41
- sigma_est = np.mean(estimate_sigma(img_np, channel_axis=None))
42
- denoised = denoise_nl_means(
43
- img_np,
44
- h=denoise_strength * sigma_est,
45
- patch_size=5,
46
- patch_distance=3,
47
- channel_axis=None,
48
- fast_mode=True
49
- )
50
-
51
- # denoise ๊ฒฐ๊ณผ๋Š” [0,1] ๋ฒ”์œ„์ด๋ฏ€๋กœ, ๋‹ค์‹œ [0,255]๋กœ ๋ณ€ํ™˜
52
- denoised = np.clip(denoised, 0, 1)
53
- denoised = (denoised * 255).astype(np.uint8)
54
- denoised_img = Image.fromarray(denoised)
55
-
56
- # ================ 2. ์ƒคํ”„๋‹ ================
57
- enhancer_sharpness = ImageEnhance.Sharpness(denoised_img)
58
- sharpened_img = enhancer_sharpness.enhance(sharpen_strength)
59
-
60
- # ================ 3. ๊ฐ๋งˆ ๋ณด์ • ================
61
- gamma_np = np.array(sharpened_img).astype(np.float32) / 255.0
62
- gamma_corrected = np.power(gamma_np, 1.0 / gamma)
63
- gamma_corrected = (gamma_corrected * 255).astype(np.uint8)
64
- gamma_corrected_img = Image.fromarray(gamma_corrected)
65
-
66
- # ================ 4. ๋ฐ๊ธฐ ================
67
- enhancer_brightness = ImageEnhance.Brightness(gamma_corrected_img)
68
- bright_img = enhancer_brightness.enhance(brightness)
69
-
70
- # ================ 5. ๋Œ€๋น„ ================
71
- enhancer_contrast = ImageEnhance.Contrast(bright_img)
72
- contrast_img = enhancer_contrast.enhance(contrast)
73
-
74
- # ================ 6. ์ฑ„๋„ ================
75
- enhancer_color = ImageEnhance.Color(contrast_img)
76
- saturated_img = enhancer_color.enhance(saturation)
77
-
78
- # ================ 7. ์ตœ์ข… ํ‘๋ฐฑ ๋ณ€ํ™˜ ================
79
- final_img = saturated_img.convert("L")
80
-
81
- return final_img
82
-
83
- def generate_output(
84
- input_image,
85
- denoise_strength,
86
- sharpen_strength,
87
- gamma,
88
- brightness,
89
- contrast,
90
- saturation
91
- ):
92
- """
93
- Gradio์—์„œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋กœ, ๋ณ€ํ™˜๋œ ํ‘๋ฐฑ ์ด๋ฏธ์ง€๋ฅผ
94
- ๋ฐ”๋กœ ํ‘œ์‹œํ•  ์ด๋ฏธ์ง€์™€ ๋‹ค์šด๋กœ๋“œ์šฉ ํŒŒ์ผ๋กœ ํ•จ๊ป˜ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
95
- """
96
- if input_image is None:
97
- return None, None
98
 
99
- # ๋ณ€ํ™˜๋œ ์ด๋ฏธ์ง€
100
- transformed = process_image(
101
- input_image,
102
- denoise_strength,
103
- sharpen_strength,
104
- gamma,
105
- brightness,
106
- contrast,
107
- saturation
108
- )
109
 
110
- # ๋‹ค์šด๋กœ๋“œ ๊ฐ€๋Šฅํ•œ JPG ํŒŒ์ผ ์ƒ์„ฑ
111
- with io.BytesIO() as output:
112
- transformed.save(output, format="JPEG")
113
- contents = output.getvalue()
114
 
115
- # Gradio์˜ File ํ˜•์‹: (ํŒŒ์ผ ๋ฐ”์ดํŠธ, MIME ํƒ€์ž…, ๋‹ค์šด๋กœ๋“œ ์‹œ ํ‘œ์‹œ๋  ํŒŒ์ผ๋ช…)
116
- file_data = (contents, "image/jpeg", "transformed.jpg")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
117
 
118
- # ๋ณ€ํ™˜๋œ ์ด๋ฏธ์ง€๋ฅผ ๊ทธ๋ฆฌ๋””์˜ค Image๋กœ ๋ณด์—ฌ์ฃผ๊ณ , ๋‹ค์šด๋กœ๋“œ ํŒŒ์ผ๋„ ํ•จ๊ป˜ ๋ฐ˜ํ™˜
119
- return transformed, file_data
120
 
121
- def main():
 
122
  with gr.Blocks() as demo:
123
- gr.Markdown("## ํ‘๋ฐฑ ๋ถ„์œ„๊ธฐ ์‚ฌ์ง„ ๋ณ€ํ™˜ ๋ฐ๋ชจ")
124
-
125
  with gr.Row():
126
- input_image = gr.Image(
127
- label="์›๋ณธ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ",
128
- type="pil"
129
- )
130
-
131
- # ์Šฌ๋ผ์ด๋”๋“ค
132
- denoise_slider = gr.Slider(
133
- 0.0, 3.0, step=0.1, value=1.0,
134
- label="๋…ธ์ด์ฆˆ ์ œ๊ฑฐ ์„ธ๊ธฐ (denoise_strength)"
135
- )
136
- sharpen_slider = gr.Slider(
137
- 0.0, 3.0, step=0.1, value=1.0,
138
- label="์ƒคํ”„๋‹ (sharpen_strength)"
139
- )
140
- gamma_slider = gr.Slider(
141
- 0.1, 3.0, step=0.1, value=1.0,
142
- label="๊ฐ๋งˆ (gamma)"
143
- )
144
- brightness_slider = gr.Slider(
145
- 0.0, 2.0, step=0.1, value=1.0,
146
- label="๋ฐ๊ธฐ (brightness)"
147
- )
148
- contrast_slider = gr.Slider(
149
- 0.0, 2.0, step=0.1, value=1.0,
150
- label="๋Œ€๋น„ (contrast)"
151
  )
152
- saturation_slider = gr.Slider(
153
- 0.0, 2.0, step=0.1, value=1.0,
154
- label="์ฑ„๋„ (saturation)"
 
 
155
  )
156
-
157
- # ๊ฒฐ๊ณผ(๋ณ€ํ™˜๋œ ์ด๋ฏธ์ง€, ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ)
 
 
 
 
158
  with gr.Row():
159
- output_image = gr.Image(
160
- label="๋ณ€ํ™˜๋œ ์ด๋ฏธ์ง€",
161
- height=300
162
- )
163
- download_file = gr.File(
164
- label="JPG ๋‹ค์šด๋กœ๋“œ"
165
- )
166
-
167
- # ๋ณ€ํ™˜ ์‹คํ–‰ ๋ฒ„ํŠผ
168
- btn = gr.Button("๋ณ€ํ™˜ ์‹คํ–‰")
169
- btn.click(
170
- fn=generate_output,
171
- inputs=[
172
- input_image,
173
- denoise_slider,
174
- sharpen_slider,
175
- gamma_slider,
176
- brightness_slider,
177
- contrast_slider,
178
- saturation_slider
179
- ],
180
- outputs=[output_image, download_file]
181
- )
182
 
183
- # ์›๋ณธ vs ๊ฒฐ๊ณผ ๋น„๊ต
184
- compare_output = gr.Image(
185
- type="pil",
186
- label="์›๋ณธ vs ๋ณ€ํ™˜๋ณธ ๋น„๊ต ๊ฒฐ๊ณผ",
187
- height=300
188
- )
189
- compare_btn = gr.Button("์›๋ณธ vs ๋ณ€ํ™˜๋ณธ ๋น„๊ต")
190
-
191
- def compare_images(
192
- input_image,
193
- denoise_strength,
194
- sharpen_strength,
195
- gamma,
196
- brightness,
197
- contrast,
198
- saturation
199
- ):
200
- if input_image is None:
201
- return None
202
- # ๋ณ€ํ™˜
203
- transformed = process_image(
204
- input_image,
205
- denoise_strength,
206
- sharpen_strength,
207
- gamma,
208
- brightness,
209
- contrast,
210
- saturation
211
- )
212
- # ๋‘ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€๋กœ๋กœ ํ•ฉ์นจ
213
- input_image_rgb = input_image.convert("RGB")
214
- transformed_rgb = transformed.convert("RGB")
215
-
216
- input_w, input_h = input_image_rgb.size
217
- transformed_w, transformed_h = transformed_rgb.size
218
- new_w = input_w + transformed_w
219
- new_h = max(input_h, transformed_h)
220
-
221
- new_image = Image.new("RGB", (new_w, new_h))
222
- new_image.paste(input_image_rgb, (0, 0))
223
- new_image.paste(transformed_rgb, (input_w, 0))
224
-
225
- return new_image
226
-
227
- compare_btn.click(
228
- fn=compare_images,
229
- inputs=[
230
- input_image,
231
- denoise_slider,
232
- sharpen_slider,
233
- gamma_slider,
234
- brightness_slider,
235
- contrast_slider,
236
- saturation_slider
237
- ],
238
- outputs=[compare_output]
239
- )
240
-
241
  return demo
242
 
243
  if __name__ == "__main__":
244
- demo_app = main()
245
- demo_app.launch()
 
1
  import gradio as gr
2
+ import cv2
3
  import numpy as np
4
+ from PIL import Image
5
+
6
+ def process_image(image,
7
+ convert_bw,
8
+ denoise,
9
+ sharpen,
10
+ gamma,
11
+ brightness,
12
+ contrast,
13
+ saturation):
14
+ # Convert PIL Image to OpenCV format
15
+ img = np.array(image)
16
+ img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
17
+
18
+ # ๋…ธ์ด์ฆˆ ์ œ๊ฑฐ
19
+ if denoise:
20
+ img = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)
21
+
22
+ # ์ƒคํ”„๋‹
23
+ if sharpen:
24
+ kernel = np.array([[0, -1, 0],
25
+ [-1, 5,-1],
26
+ [0, -1, 0]])
27
+ img = cv2.filter2D(img, -1, kernel)
28
+
29
+ # ๊ฐ๋งˆ ๋ณด์ •
30
+ if gamma != 1.0:
31
+ invGamma = 1.0 / gamma
32
+ table = np.array([((i / 255.0) ** invGamma) * 255
33
+ for i in np.arange(256)]).astype("uint8")
34
+ img = cv2.LUT(img, table)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
 
36
+ # ๋ฐ๊ธฐ ์กฐ์ •
37
+ if brightness != 0:
38
+ img = cv2.convertScaleAbs(img, alpha=1, beta=brightness)
 
 
 
 
 
 
 
39
 
40
+ # ๋Œ€๋น„ ์กฐ์ •
41
+ if contrast != 1.0:
42
+ img = cv2.convertScaleAbs(img, alpha=contrast, beta=0)
 
43
 
44
+ # ์ฑ„๋„ ์กฐ์ •
45
+ if saturation != 1.0:
46
+ hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV).astype(np.float32)
47
+ hsv[...,1] = hsv[...,1] * saturation
48
+ hsv[...,1] = np.clip(hsv[...,1], 0, 255)
49
+ img = cv2.cvtColor(hsv.astype(np.uint8), cv2.COLOR_HSV2BGR)
50
+
51
+ # ํ‘๋ฐฑ ๋ณ€ํ™˜
52
+ if convert_bw:
53
+ img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
54
+ img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
55
+
56
+ # ๋ณ€ํ™˜๋œ ์ด๋ฏธ์ง€๋ฅผ PIL ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜
57
+ transformed_image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
58
+ transformed_image = Image.fromarray(transformed_image)
59
+
60
+ return transformed_image
61
 
62
+ def compare_images(original, transformed):
63
+ return transformed
64
 
65
+ # Gradio ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ์„ฑ
66
+ def create_interface():
67
  with gr.Blocks() as demo:
68
+ gr.Markdown("## ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜")
69
+
70
  with gr.Row():
71
+ with gr.Column():
72
+ input_image = gr.Image(type="pil", label="์›๋ณธ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ")
73
+ convert_bw = gr.Checkbox(label="ํ‘๋ฐฑ์œผ๋กœ ๋ณ€ํ™˜", value=True)
74
+ denoise = gr.Checkbox(label="๋…ธ์ด์ฆˆ ์ œ๊ฑฐ", value=False)
75
+ sharpen = gr.Checkbox(label="์ƒคํ”„๋‹", value=False)
76
+ gamma = gr.Slider(label="๊ฐ๋งˆ ๋ณด์ •", minimum=0.1, maximum=3.0, step=0.1, value=1.0)
77
+ brightness = gr.Slider(label="๋ฐ๊ธฐ ์กฐ์ •", minimum=-100, maximum=100, step=1, value=0)
78
+ contrast = gr.Slider(label="๋Œ€๋น„ ์กฐ์ •", minimum=0.5, maximum=1.5, step=0.1, value=1.0)
79
+ saturation = gr.Slider(label="์ฑ„๋„ ์กฐ์ •", minimum=0.0, maximum=2.0, step=0.1, value=1.0)
80
+ submit = gr.Button("๋ณ€ํ™˜ํ•˜๊ธฐ")
81
+
82
+ with gr.Column():
83
+ output_image = gr.Image(type="pil", label="๋ณ€ํ™˜๋œ ์ด๋ฏธ์ง€")
84
+ download = gr.Button("JPG๋กœ ๋‹ค์šด๋กœ๋“œ")
85
+
86
+ submit.click(
87
+ fn=process_image,
88
+ inputs=[input_image, convert_bw, denoise, sharpen, gamma, brightness, contrast, saturation],
89
+ outputs=output_image
 
 
 
 
 
 
90
  )
91
+
92
+ download.click(
93
+ fn=lambda img: img.save("transformed_image.jpg"),
94
+ inputs=output_image,
95
+ outputs=None
96
  )
97
+
98
+ gr.Markdown("""
99
+ ### ์ด๋ฏธ์ง€ ๋น„๊ต
100
+ ์Šฌ๋ผ์ด๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›๋ณธ ์ด๋ฏธ์ง€์™€ ๋ณ€ํ™˜๋œ ์ด๋ฏธ์ง€๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
101
+ """)
102
+
103
  with gr.Row():
104
+ original_display = gr.Image(type="pil", label="์›๋ณธ ์ด๋ฏธ์ง€", interactive=False)
105
+ transformed_display = gr.Image(type="pil", label="๋ณ€ํ™˜๋œ ์ด๋ฏธ์ง€", interactive=False)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
106
 
107
+ input_image.change(lambda img: (img, process_image(img, convert_bw.value, denoise.value, sharpen.value, gamma.value, brightness.value, contrast.value, saturation.value)),
108
+ inputs=input_image,
109
+ outputs=[original_display, transformed_display])
110
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
  return demo
112
 
113
  if __name__ == "__main__":
114
+ interface = create_interface()
115
+ interface.launch()