Spaces:
Running
Running
add colorutils module
Browse files- myapp/app.py +2 -1
- myapp/colorutils.py +33 -0
- myapp/palette.py +1 -16
- myapp/pall_app.py +2 -1
myapp/app.py
CHANGED
@@ -10,7 +10,8 @@ from huggingface_hub import InferenceClient
|
|
10 |
from PIL import Image
|
11 |
from qrcode_artistic import write_artistic
|
12 |
|
13 |
-
from myapp.
|
|
|
14 |
|
15 |
try:
|
16 |
import dotenv
|
|
|
10 |
from PIL import Image
|
11 |
from qrcode_artistic import write_artistic
|
12 |
|
13 |
+
from myapp.colorutils import array_to_hex
|
14 |
+
from myapp.palette import extract_color_clusters, sort_color_clusters
|
15 |
|
16 |
try:
|
17 |
import dotenv
|
myapp/colorutils.py
ADDED
@@ -0,0 +1,33 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import colorsys
|
2 |
+
from typing import NamedTuple
|
3 |
+
|
4 |
+
import numpy as np
|
5 |
+
|
6 |
+
|
7 |
+
class HSVUpdate(NamedTuple):
|
8 |
+
h: int = 0
|
9 |
+
s: int = 0
|
10 |
+
v: int = 0
|
11 |
+
|
12 |
+
def apply(self, color: np.ndarray):
|
13 |
+
hsv = colorsys.rgb_to_hsv(*color / 255)
|
14 |
+
tmp = np.add(hsv, self).clip(0, 1)
|
15 |
+
rgb = colorsys.hsv_to_rgb(*tmp)
|
16 |
+
|
17 |
+
return np.array(rgb) * 255
|
18 |
+
|
19 |
+
|
20 |
+
def get_hsv_value(cluster: np.ndarray):
|
21 |
+
return colorsys.rgb_to_hsv(*cluster / 255)[2]
|
22 |
+
|
23 |
+
|
24 |
+
def add_hsv_saturation(cluster: np.ndarray, delta: float):
|
25 |
+
h, s, v = colorsys.rgb_to_hsv(*cluster / 255)
|
26 |
+
s = max(0, min(1, s + delta))
|
27 |
+
|
28 |
+
return np.array(colorsys.hsv_to_rgb(h, s, v)) * 255
|
29 |
+
|
30 |
+
|
31 |
+
def array_to_hex(values: np.ndarray):
|
32 |
+
values = np.round(values).astype(int)
|
33 |
+
return "#" + ("{:02X}" * len(values)).format(*values)
|
myapp/palette.py
CHANGED
@@ -1,20 +1,10 @@
|
|
1 |
-
import colorsys
|
2 |
import itertools
|
3 |
|
4 |
import numpy as np
|
5 |
from PIL import Image
|
6 |
from sklearn.cluster import KMeans
|
7 |
|
8 |
-
|
9 |
-
def get_hsv_value(cluster: np.ndarray):
|
10 |
-
return colorsys.rgb_to_hsv(*cluster / 255)[2]
|
11 |
-
|
12 |
-
|
13 |
-
def add_hsv_saturation(cluster: np.ndarray, delta: float):
|
14 |
-
h, s, v = colorsys.rgb_to_hsv(*cluster / 255)
|
15 |
-
s = max(0, min(1, s + delta))
|
16 |
-
|
17 |
-
return np.array(colorsys.hsv_to_rgb(h, s, v)) * 255
|
18 |
|
19 |
|
20 |
def extract_color_clusters(image_array: np.ndarray | Image.Image, n_clusters=2):
|
@@ -49,8 +39,3 @@ def generate_palette_image(k_means: KMeans, size=40, shades=(0.0,)):
|
|
49 |
image.paste(part, position)
|
50 |
|
51 |
return image
|
52 |
-
|
53 |
-
|
54 |
-
def array_to_hex(values: np.ndarray):
|
55 |
-
values = np.round(values).astype(int)
|
56 |
-
return "#" + ("{:02X}" * len(values)).format(*values)
|
|
|
|
|
1 |
import itertools
|
2 |
|
3 |
import numpy as np
|
4 |
from PIL import Image
|
5 |
from sklearn.cluster import KMeans
|
6 |
|
7 |
+
from myapp.colorutils import add_hsv_saturation, get_hsv_value
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
|
9 |
|
10 |
def extract_color_clusters(image_array: np.ndarray | Image.Image, n_clusters=2):
|
|
|
39 |
image.paste(part, position)
|
40 |
|
41 |
return image
|
|
|
|
|
|
|
|
|
|
myapp/pall_app.py
CHANGED
@@ -3,7 +3,8 @@ from contextlib import ExitStack
|
|
3 |
import gradio as gr
|
4 |
import numpy as np
|
5 |
|
6 |
-
from myapp.
|
|
|
7 |
|
8 |
with gr.Blocks() as demo:
|
9 |
image = gr.Image("vulture.webp")
|
|
|
3 |
import gradio as gr
|
4 |
import numpy as np
|
5 |
|
6 |
+
from myapp.colorutils import array_to_hex
|
7 |
+
from myapp.palette import extract_color_clusters, iter_color_shades
|
8 |
|
9 |
with gr.Blocks() as demo:
|
10 |
image = gr.Image("vulture.webp")
|