【问题标题】:My Python script reads wrong RGB values - OpenCV我的 Python 脚本读取错误的 RGB 值 - OpenCV
【发布时间】:2020-02-29 21:50:24
【问题描述】:

我正在尝试编写代码来从像素的 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

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]

【问题讨论】:

  • 检查您是如何选择抓取颜色的点的。问题不在于颜色识别或 OpenCV 给出“错误的 RGB”,而在于您采取了错误的观点。在图像上画出点,看看它们出现在哪里,做数学以使它们正确。
  • 数组可以使用坐标Y,X (row,column) 而不是X,Y
  • @furas 非常感谢我还没有看到这个错误

标签: python python-3.x opencv image-processing computer-vision


【解决方案1】:

数组可以使用坐标 Y,X (row,column) 而不是 X,Y – furas

【讨论】:

    猜你喜欢
    • 2012-08-24
    • 2014-12-25
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    相关资源
    最近更新 更多