我有一组图像,有四种可能的颜色R,G,B和Y.在相机前面,我有四个图像序列,可能有任何颜色组合。对于前者R,R,G,B或R,G,B,Y等。为了找到哪种算法或方法最佳的正确序列?
我添加了一个示例图片。
代码应该返回正确的RGBG序列。
答案 0 :(得分: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']