我有一组具有四种可能颜色 R、G、B 和 Y 的图像。在相机前,我有四个图像序列,具有任何可能的颜色组合。例如。R、R、G、B 或 R、G、B、Y 等。为了找到正确的序列,哪种算法或方法最好?
我添加了一个示例图像。
代码应返回正确的 RGBG 序列。
正如我之前提到的,将图像转换为 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']