Мой скрипт Python читает неправильные значения RGB - OpenCV - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь написать код для распознавания цветов по значениям пикселей 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]

1 Ответ

1 голос
/ 04 ноября 2019

массив может использовать координаты Y, X (строка, столбец) вместо X, Y - furas

...