for x in range(0,img_row):
for y in range(0,img_col):
img_lst.append([img[x,y][0],img[x,y][1],img[x,y][2]])
return img_lst
如何在此处使用列表理解?
img_lst = [img[x,y][0], img[x,y][1], img[x,y][2] y for y in range(0,img_col) for x in range(0, img_row)]
我尝试了这个,但它提供了无效的语法,当我删除" y"在一开始它给了我Y没有定义
整个功能:
def cvimg_to_list(img):
img_row = img.shape[0]
img_col = img.shape[1]
img_lst=[]
img_lst = [img[x,y][0], img[x,y][1], img[x,y][2] y for y in range(0,img_col) for x in range(0, img_row)]
return img_lst
答案 0 :(得分:4)
要将带有list.append()
调用的嵌套循环转换为列表推导,您只需将.append(...)
括号之间的所有内容移到前面,然后删除:
冒号后的for
冒号。 [...]
循环,最后在结果周围添加[
[img[x,y][0],img[x,y][1],img[x,y][2]]
for x in range(0,img_row)
for y in range(0,img_col)
]
:
for
请注意range()
循环的顺序不会改变!
然后可以将其放在一行;为了便于阅读,我添加了一些空格并简化了[[img[x, y][0], img[x, y][1], img[x, y][2]]
for x in range(img_row) for y in range(img_col)]
调用:
img[x, y]
由于您使用[img[x, y][:3] for x in range(img_row) for y in range(img_col)]
中的前3个值构建新列表,因此您还可以使用切片:
for
你在尝试中犯了三个错误;你交换了y
循环的顺序,你添加了一个额外的,迷路]
,你删除了每次迭代产生的列表对象的 var colonneB = selectedRange.Rows.Cast<Excel.Range>().Select(x => x.Value2.ToString()).ToList();
结束括号。
答案 1 :(得分:1)
我不完全确定你想要实现什么,但如果我的假设是正确的(你想从你用opencv打开的图像的三个通道中获得像素值列表),你可以使用numpy来做到这一点。
img_lst=img.reshape(-1,3).tolist()
请记住,cv2将图像加载为BGR而非RGB。
注意:如果没有正确回答问题,我宁愿将此作为评论发布,但我没有足够的声誉