I am struggling with converting red color to another color, blue, yellow, green and so on.
I’ve already achieved to convert red color to gray scale color as bellow.
JavaScript
x
19
19
1
img2 = cv2.imread('output2.jpg')
2
img_hsv=cv2.cvtColor(img2, cv2.COLOR_BGR2HSV)
3
4
# lower mask (0-10)
5
lower_red = np.array([0,50,50])
6
upper_red = np.array([10,255,255])
7
mask0 = cv2.inRange(img_hsv, lower_red, upper_red)
8
9
# upper mask (170-180)
10
lower_red = np.array([170,50,50])
11
upper_red = np.array([180,255,255])
12
mask1 = cv2.inRange(img_hsv, lower_red, upper_red)
13
14
# join my masks
15
mask = mask0+mask1
16
17
output_img = img2.copy()
18
output_img[np.where(mask!=0)] = 125
19
But what I really want to achieve is turn a color into another one but not gray scale. How should I change the code or any good reference? Thank you.
Advertisement
Answer
You are using the value 125 to all points in your mask with:
JavaScript
1
2
1
output_img[np.where(mask!=0)] = 125
2
If you want to change to a colored pixel, just assign a color array to that pixel such as:
JavaScript
1
2
1
output_img[np.where(mask!=0)] = [125, 50, 50] #RGB array
2
Complete code:
JavaScript
1
33
33
1
import numpy as np
2
import cv2
3
import matplotlib.pyplot as plt
4
5
img2 = cv2.imread('sample.png')
6
img_hsv=cv2.cvtColor(img2, cv2.COLOR_BGR2HSV)
7
# lower mask (0-10)
8
lower_red = np.array([50,50,0])
9
upper_red = np.array([255,255,50])
10
mask0 = cv2.inRange(img_hsv, lower_red, upper_red)
11
12
# upper mask (170-180)
13
lower_red = np.array([50,50,50])
14
upper_red = np.array([255,255,180])
15
mask1 = cv2.inRange(img_hsv, lower_red, upper_red)
16
17
# join my masks
18
mask = mask0+mask1
19
20
output_img = img2.copy()
21
output_img[np.where(mask!=0)] = [125, 50, 50]
22
23
24
plt.imshow(img2)
25
26
plt.title('Original')
27
plt.show()
28
29
plt.imshow(output_img)
30
31
plt.title('After')
32
plt.show()
33