ir12345 commited on
Commit
9f71d3a
·
verified ·
1 Parent(s): 29ced0d

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +103 -0
app.py ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import cv2
2
+ import numpy as np
3
+ import gradio as gr
4
+ import tempfile
5
+
6
+ def color_transfer(source, target):
7
+ # Resize target to match source
8
+ target = cv2.resize(target, (source.shape[1], source.shape[0]))
9
+
10
+ # Convert to LAB color space
11
+ source_lab = cv2.cvtColor(source, cv2.COLOR_BGR2LAB).astype("float32")
12
+ target_lab = cv2.cvtColor(target, cv2.COLOR_BGR2LAB).astype("float32")
13
+
14
+ # Calculate mean and std dev
15
+ (l_mean_src, a_mean_src, b_mean_src), (l_std_src, a_std_src, b_std_src) = cv2.meanStdDev(source_lab)
16
+ (l_mean_tar, a_mean_tar, b_mean_tar), (l_std_tar, a_std_tar, b_std_tar) = cv2.meanStdDev(target_lab)
17
+
18
+ # Apply color transfer
19
+ l, a, b = cv2.split(source_lab)
20
+ l -= l_mean_src[0]
21
+ a -= a_mean_src[0]
22
+ b -= b_mean_src[0]
23
+ l = (l * (l_std_tar[0] / l_std_src[0])) + l_mean_tar[0]
24
+ a = (a * (a_std_tar[0] / a_std_src[0])) + a_mean_tar[0]
25
+ b = (b * (b_std_tar[0] / b_std_src[0])) + b_mean_tar[0]
26
+
27
+ # Merge and convert back to BGR
28
+ transfer_lab = cv2.merge([l, a, b])
29
+ transfer_lab = np.clip(transfer_lab, 0, 255).astype("uint8")
30
+ result_bgr = cv2.cvtColor(transfer_lab, cv2.COLOR_LAB2BGR)
31
+
32
+ return result_bgr, target # Return resized target too
33
+
34
+ def process_images(source_img, ref_img, red_scale, green_scale, blue_scale, brightness, contrast):
35
+ if source_img is None or ref_img is None:
36
+ raise gr.Error("Please upload both the source image and the reference image before clicking Convert.")
37
+
38
+ # Convert RGB to BGR
39
+ source_bgr = cv2.cvtColor(source_img, cv2.COLOR_RGB2BGR)
40
+ ref_bgr = cv2.cvtColor(ref_img, cv2.COLOR_RGB2BGR)
41
+
42
+ # Perform color transfer
43
+ output_bgr, resized_ref_bgr = color_transfer(source_bgr, ref_bgr)
44
+
45
+ # Apply color scaling
46
+ b, g, r = cv2.split(output_bgr)
47
+ r = np.clip(r * red_scale, 0, 255).astype(np.uint8)
48
+ g = np.clip(g * green_scale, 0, 255).astype(np.uint8)
49
+ b = np.clip(b * blue_scale, 0, 255).astype(np.uint8)
50
+ output_bgr = cv2.merge([b, g, r])
51
+
52
+ # Apply brightness and contrast adjustment
53
+ output_bgr = cv2.convertScaleAbs(output_bgr, alpha=contrast, beta=brightness)
54
+
55
+ # Convert all images to RGB for display
56
+ source_rgb = cv2.cvtColor(source_bgr, cv2.COLOR_BGR2RGB)
57
+ ref_rgb = cv2.cvtColor(resized_ref_bgr, cv2.COLOR_BGR2RGB)
58
+ output_rgb = cv2.cvtColor(output_bgr, cv2.COLOR_BGR2RGB)
59
+
60
+ # Save output to temp file for download
61
+ temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".png")
62
+ cv2.imwrite(temp_file.name, output_bgr)
63
+
64
+ return source_rgb, ref_rgb, output_rgb, temp_file.name
65
+
66
+
67
+ # Gradio UI
68
+ with gr.Blocks() as demo:
69
+ gr.Markdown("## 🎨 Color Transfer: Style Match Between Images")
70
+
71
+ with gr.Row():
72
+ source_input = gr.Image(type="numpy", label="Upload Source Image")
73
+ ref_input = gr.Image(type="numpy", label="Upload Reference Image")
74
+
75
+ with gr.Row():
76
+ red_slider = gr.Slider(0.0, 2.0, value=1.0, label="Red Scale")
77
+ green_slider = gr.Slider(0.0, 2.0, value=1.0, label="Green Scale")
78
+ blue_slider = gr.Slider(0.0, 2.0, value=1.0, label="Blue Scale")
79
+
80
+ with gr.Row():
81
+ brightness_slider = gr.Slider(-100, 100, value=0, label="Brightness")
82
+ contrast_slider = gr.Slider(0.1, 3.0, value=1.0, label="Contrast")
83
+
84
+ convert_button = gr.Button("Convert")
85
+
86
+ with gr.Row():
87
+ source_display = gr.Image(label="Source Image")
88
+ ref_display = gr.Image(label="Resized Reference Image")
89
+ output_display = gr.Image(label="Output Image")
90
+
91
+ download_output = gr.File(label="Download Result Image")
92
+
93
+ convert_button.click(
94
+ fn=process_images,
95
+ inputs=[
96
+ source_input, ref_input,
97
+ red_slider, green_slider, blue_slider,
98
+ brightness_slider, contrast_slider
99
+ ],
100
+ outputs=[source_display, ref_display, output_display, download_output]
101
+ )
102
+
103
+ demo.launch()