maaz21 commited on
Commit
9ed4995
·
verified ·
1 Parent(s): 38c4bbd

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +44 -21
app.py CHANGED
@@ -4,48 +4,71 @@ import numpy as np
4
  from PIL import Image
5
  import io
6
 
7
- st.set_page_config(page_title="Image Color Changer", page_icon="🎨", layout="centered")
8
  st.title("🎨 Image Color Changer")
9
- st.markdown("Upload an image and change its color dynamically!")
10
 
11
  # Upload Image
12
  uploaded_file = st.file_uploader("Upload an Image", type=["png", "jpg", "jpeg", "webp"])
13
 
14
  if uploaded_file is not None:
15
- # Load image using PIL and convert to NumPy array
16
  image = Image.open(uploaded_file)
17
  image = np.array(image)
18
 
19
  # Ensure the image has 3 channels (RGB)
20
- if len(image.shape) == 2: # Grayscale image (Single Channel)
21
  image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB)
22
- elif image.shape[-1] == 4: # RGBA image (4 channels)
23
  image = cv2.cvtColor(image, cv2.COLOR_RGBA2RGB)
24
 
25
- # Display Original Image
26
  st.image(image, caption="Original Image", use_column_width=True)
27
 
28
  # Color Picker
29
- st.subheader("Select Target Color")
30
- target_color = st.color_picker("Choose a color", "#ff0000") # Default red
31
 
32
  # Convert Hex to RGB
33
- hex_color = target_color.lstrip("#")
34
- new_color = tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
35
 
36
- # Intensity Slider
37
- intensity = st.slider("Color Intensity", 0, 100, 50)
38
 
39
- # Function to Change Image Color
40
- def change_image_color(img, new_rgb, intensity=50):
41
- img_hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
42
- img_hsv[:, :, 0] = new_rgb[0] * (intensity / 100) # Adjust Hue
43
- img_hsv[:, :, 1] = new_rgb[1] * (intensity / 100) # Adjust Saturation
44
- img_hsv[:, :, 2] = new_rgb[2] * (intensity / 100) # Adjust Brightness
45
- return cv2.cvtColor(img_hsv, cv2.COLOR_HSV2RGB)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
 
47
  # Apply Color Change
48
- modified_image = change_image_color(image, new_color, intensity)
49
  st.image(modified_image, caption="Modified Image", use_column_width=True)
50
 
51
  # Download Button
@@ -54,4 +77,4 @@ if uploaded_file is not None:
54
  st.download_button("Download Modified Image", img_byte_arr.getvalue(), file_name="modified_image.png", mime="image/png")
55
 
56
  st.markdown("---")
57
- st.markdown("💡 Developed with ❤️ using Streamlit, OpenCV, and NumPy")
 
4
  from PIL import Image
5
  import io
6
 
7
+ st.set_page_config(page_title="🎨 Image Color Changer", page_icon="🎨", layout="centered")
8
  st.title("🎨 Image Color Changer")
9
+ st.markdown("Upload an image, select a color, and change its appearance dynamically!")
10
 
11
  # Upload Image
12
  uploaded_file = st.file_uploader("Upload an Image", type=["png", "jpg", "jpeg", "webp"])
13
 
14
  if uploaded_file is not None:
15
+ # Convert image to OpenCV format
16
  image = Image.open(uploaded_file)
17
  image = np.array(image)
18
 
19
  # Ensure the image has 3 channels (RGB)
20
+ if len(image.shape) == 2: # Convert grayscale to RGB
21
  image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB)
22
+ elif image.shape[-1] == 4: # Convert RGBA to RGB
23
  image = cv2.cvtColor(image, cv2.COLOR_RGBA2RGB)
24
 
 
25
  st.image(image, caption="Original Image", use_column_width=True)
26
 
27
  # Color Picker
28
+ st.subheader("Select Target Color to Replace")
29
+ selected_color = st.color_picker("Pick a color to change", "#ff0000") # Default Red
30
 
31
  # Convert Hex to RGB
32
+ hex_color = selected_color.lstrip("#")
33
+ target_rgb = tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
34
 
35
+ # Color Tolerance
36
+ tolerance = st.slider("Color Tolerance (Higher = More Area)", 0, 100, 30)
37
 
38
+ # Replace Color Function
39
+ def replace_color(img, target_rgb, new_rgb, tolerance):
40
+ # Convert to HSV for better color detection
41
+ hsv_img = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
42
+
43
+ # Convert target RGB to HSV
44
+ target_hsv = cv2.cvtColor(np.uint8([[target_rgb]]), cv2.COLOR_RGB2HSV)[0][0]
45
+
46
+ # Define HSV range for mask
47
+ lower_bound = np.array([max(0, target_hsv[0] - tolerance), 50, 50])
48
+ upper_bound = np.array([min(179, target_hsv[0] + tolerance), 255, 255])
49
+
50
+ # Create a mask for selected color
51
+ mask = cv2.inRange(hsv_img, lower_bound, upper_bound)
52
+
53
+ # Convert new RGB to HSV
54
+ new_hsv = cv2.cvtColor(np.uint8([[new_rgb]]), cv2.COLOR_RGB2HSV)[0][0]
55
+
56
+ # Apply color change where the mask is active
57
+ hsv_img[mask > 0] = new_hsv
58
+
59
+ # Convert back to RGB
60
+ return cv2.cvtColor(hsv_img, cv2.COLOR_HSV2RGB)
61
+
62
+ # Select Replacement Color
63
+ st.subheader("Choose New Color")
64
+ new_color = st.color_picker("Pick the replacement color", "#00ff00") # Default Green
65
+
66
+ # Convert New Color to RGB
67
+ hex_new_color = new_color.lstrip("#")
68
+ new_rgb = tuple(int(hex_new_color[i:i+2], 16) for i in (0, 2, 4))
69
 
70
  # Apply Color Change
71
+ modified_image = replace_color(image, target_rgb, new_rgb, tolerance)
72
  st.image(modified_image, caption="Modified Image", use_column_width=True)
73
 
74
  # Download Button
 
77
  st.download_button("Download Modified Image", img_byte_arr.getvalue(), file_name="modified_image.png", mime="image/png")
78
 
79
  st.markdown("---")
80
+ st.markdown("💡 Developed with ❤️ using Streamlit, OpenCV, and NumPy")