1

我有一组具有四种可能颜色 R、G、B 和 Y 的图像。在相机前,我有四个图像序列,具有任何可能的颜色组合。例如。R、R、G、B 或 R、G、B、Y 等。为了找到正确的序列,哪种算法或方法最好?

我添加了一个示例图像。在此处输入图像描述

代码应返回正确的 RGBG 序列。

4

1 回答 1

3

正如我之前提到的,将图像转换为 HSV 平面。HSV 平面最好选择特定的颜色。(代码在 Python 中)

import numpy as np
import cv2

img  = cv2.imread('sofqn.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
hsv = cv2.cvtColor(gray,cv2.COLOR_BGR2HSV)

然后对图像进行二值化。您可以使用 threshold() 函数。但我不知道你的亮度会如何。所以我用 Canny() 进行边缘检测。并在其中找到轮廓。

edges = cv2.Canny(img,50,150)
contours,hierarchy = cv2.findContours(edges,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

然后对于每个轮廓(您现在可以将轮廓视为图像中的对象),找到它的区域。如果它很小,那就是噪音,避免它。否则,我们为它找到一个边界矩形,它给出了它的左上角(x,y)、宽度(w)、高度(h)。由此,我们找到了正方形的中心点。检查其在 HSV 图像中的颜色,并检查它是否为 R、G、B、Y。我们将它们,即质心 (cx,cy) 和颜色放在一个列表(或数组)中。最后我们按照 x 坐标对它们进行排序,使第一行对应第一个正方形,依此类推。

res = []
for cnt in contours:
    if cv2.contourArea(cnt) > 100:
        x,y,w,h = cv2.boundingRect(cnt)
        cx,cy = x+w/2, y+h/2
        color = hsv[cy,cx,0]

        if (color < 10 or color > 170):
            res.append([cx,cy,'R'])
        elif(50 < color < 70):
            res.append([cx,cy,'G'])
        elif(20 < color <40):
            res.append([cx,cy,'Y'])
        elif(110 < color < 130):
            res.append([cx,cy,'B'])

res = sorted(res,key = lambda res : res[0])
colors = [x[2] for x in res]
print colors

这给了我结果:['R', 'G', 'B', 'G']

于 2013-01-23T10:41:02.777 回答