Я пытаюсь написать код для распознавания цветов по значениям пикселей HSV. Распознавание цветов работает очень хорошо, но иногда оно принимает неправильные значения (я проверил их на графике)
Изображение, с которым я работаю: https://www.pyimagesearch.com/wp-content/uploads/2016/01/shapes_and_colors.jpg
Вот мой словарь со значениямицвета в цветовом пространстве HSV:
# colors in Hue Saturation Value color space
colors = {
'red': np.array([0, 100, 100]),
'orange': np.array([30, 100, 100]),
'yellow': np.array([60, 100, 100]),
'green': np.array([120, 100, 100]),
'blue': np.array([240, 100, 100]),
'violet': np.array([270, 100, 100]),
'pink': np.array([330, 100, 100]),
}
Функция распознавания цвета, которая возвращает имя цвета строки (rgb_to_hsv работает, хорошие значения верны - я проверил это на http://colorizer.org/)
def colorRecognition(pixelRGB):
pixelHSV = rgb_to_hsv(pixelRGB)
if pixelHSV[1] < 10:
if pixelHSV[2] < 12:
return 'black'
elif pixelHSV[2] > 80:
return 'white'
else:
return 'gray'
else:
diff = np.empty(shape=(0, 2), dtype=([('values', np.dtype(int)), ('names', type(colors.keys()))]))
for name, value in colors.items():
abs_diff = abs(int(pixelHSV[0]) - int(value[0]))
diff = np.append(diff, np.array([(abs_diff, name)], dtype=diff.dtype))
color = np.sort(diff)[0][1]
if pixelHSV[2] < 10:
return 'black'
else:
return color
ядро сценария:
img = cv.imread('img/shapes_and_colors.jpg')
rgb = cv.cvtColor(img, cv.COLOR_BGR2RGB)
gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
blurred = cv.GaussianBlur(gray, (5, 5), 0)
thresh = cv.threshold(blurred, 70, 255, cv.THRESH_BINARY)[1]
cnts = cv.findContours(thresh.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
points = np.empty(shape=(0, 4))
for c in cnts:
M = cv.moments(c)
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
points = np.append(points, [[cX, cY, rgb[cX, cY], colorRecognition(rgb[cX, cY])]], axis=0)
Вывод сценария:
https://i.stack.imgur.com/yP2hp.jpg <- изображение с нумерованными формами и распознанными цветами </p>
1.X: 239, Y:421
color: blue
rbg: [ 0 130 224]
hsv: [205, 100, 87]
2.X: 344, Y:451
color: gray
rbg: [35 34 32]
hsv: [39, 8, 13]
3.X: 433, Y:398
color: red
rbg: [43 37 37]
hsv: [0, 13, 16]
4.X: 155, Y:377
color: black
rbg: [20 16 15]
hsv: [12, 25, 7]
5.X: 395, Y:330
color: orange
rbg: [255 157 94]
hsv: [23, 63, 100]
6.X: 220, Y:328
color: blue
rbg: [22 25 30]
hsv: [217, 26, 11]
7.X: 291, Y:312
color: yellow
rbg: [229 214 73]
hsv: [54, 68, 89]
8.X: 491, Y:263
color: gray
rbg: [44 44 42]
hsv: [60, 4, 17]
9.X: 340, Y:244
color: green
rbg: [32 37 33]
hsv: [132, 13, 14]
10.X: 410, Y:229
color: blue
rbg: [ 1 142 234]
hsv: [203, 99, 91]
11.X: 144, Y:229
color: black
rbg: [19 18 16]
hsv: [40, 15, 7]
12.X: 338, Y:182
color: yellow
rbg: [36 35 31]
hsv: [48, 13, 14]
13.X: 199, Y:171
color: yellow
rbg: [244 230 81]
hsv: [54, 66, 95]
14.X: 266, Y:174
color: yellow
rbg: [234 218 81]
hsv: [53, 65, 91]
15.X: 238, Y:98
color: yellow
rbg: [250 246 95]
hsv: [58, 62, 98]
16.X: 132, Y:111
color: yellow
rbg: [234 218 71]
hsv: [54, 69, 91]
17.X: 365, Y:102
color: gray
rbg: [37 36 34]
hsv: [39, 8, 14]