我已经合并了两个列表:
RGB列表来自图像,像素列表来自图像(y * w)。
rgb_list, pixel_list我这样做是通过使用zip:
rgb_pixel = [zip(rgb, _pixels)]这将给我:
rgb_pixel = [[(255, 0, 255), (0, 1)], [(0, 0, 0), (0, 2)]]我这么做的原因是为了消除
RGB == 0, 0, 0 同时得到正确的x,y坐标。
这是我用来删除上述坐标的代码:
non_blank_pixels = [i[1] for i in pixels if i[0] != (0, 0, 0)]这将产生一个列表,只有x,y坐标是“不空白”的或,没有RGB为0,0,0。
结果:
non_blank_pixels = [(0, 2), (0, 3)..]完整代码:
rgb_list= tuple(zip(sct_img.raw[2::4], sct_img.raw[1::4], sct_img.raw[0::4]))
pixel_list= tuple((x, y) for y in range(height) for x in range(width))
rgb_pixel= tuple(zip(rgb, _pixels))
non_blank_pixels = [i[1] for i in pixels if i[0] != (0, 0, 0)]这是可行的,但是对于2-5 ms的计算,大部分是关于这一部分的:
pixel_list = tuple((x, y) for y in range(height) for x in range(width))有什么办法能让我加快速度吗?
发布于 2021-04-24 14:09:10
如果主要目标是有一个非空坐标的列表,那么您只需要循环遍历您的高度*宽度像素一次。
首先,让我们弄清楚如何从sct_img.raw列表中获取给定像素的RGB值。我在这里做了一些假设,因为我不熟悉你如何解析你的形象。你所需要的数学可能略有不同,但如果我的假设不正确的话,这个方法应该仍然适用。
我的假设是:
这意味着每3*宽度条目描述一行像素。这意味着,每当我们移到下一行时,我们应该在数组中移动3*宽度元素。换句话说,第0行被索引0 to (3 * width) - 1中的所有元素捕获,第1行被索引3 * width to (6 * width) - 1等的所有元素捕获。
根据我们的假设,我们知道(sct_img.raw[0],sct_img.raw[1], sct_img.raw[2])描述像素(0,0),接下来的3,即(sct_img.raw[3],sct_img.raw[4], sct_img.raw[5])描述像素(0,1)。当我们移动到下一列时,我们向下移动3。
这样我们就可以建立一个通用的公式。位置(x,y)处任意像素的R值将为r_value = sct_image.raw[(x*3) + (y*3*width)]。
最后,我们现在可以通过简单地检查像素在添加之前是否是空的来获得像素列表。
pixel_list = []
for x in range(width):
for y in range(height):
rgb = (sct_image.raw[(x*3) + (y*3*width)], sct_image.raw[(x*3) + (y*3*width) + 1], sct_image.raw[(x*3) + (y*3*width) + 2])
pixel_list.append((x, y)) if rgb != (0, 0, 0)
# or as a one liner
pixel_list[(x, y) for x in range(width) for y in range(height) if (sct_image.raw[(x*3) + (y*3*width)], sct_image.raw[(x*3) + (y*3*width) + 1], sct_image.raw[(x*3) + (y*3*width) + 2]) != (0, 0, 0)]https://stackoverflow.com/questions/67243098
复制相似问题