首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每个像素计算的最快方法

每个像素计算的最快方法
EN

Stack Overflow用户
提问于 2021-04-24 13:04:43
回答 1查看 45关注 0票数 0

我已经合并了两个列表:

RGB列表来自图像,像素列表来自图像(y * w)。

代码语言:javascript
复制
rgb_list, pixel_list

我这样做是通过使用zip:

代码语言:javascript
复制
rgb_pixel = [zip(rgb, _pixels)]

这将给我:

代码语言:javascript
复制
rgb_pixel = [[(255, 0, 255), (0, 1)], [(0, 0, 0), (0, 2)]]

我这么做的原因是为了消除

代码语言:javascript
复制
RGB == 0, 0, 0 

同时得到正确的x,y坐标。

这是我用来删除上述坐标的代码:

代码语言:javascript
复制
non_blank_pixels = [i[1] for i in pixels if i[0] != (0, 0, 0)]

这将产生一个列表,只有x,y坐标是“不空白”的,没有RGB为0,0,0

结果:

代码语言:javascript
复制
non_blank_pixels = [(0, 2), (0, 3)..]

完整代码:

代码语言:javascript
复制
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的计算,大部分是关于这一部分的:

代码语言:javascript
复制
pixel_list = tuple((x, y) for y in range(height) for x in range(width))

有什么办法能让我加快速度吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-24 14:09:10

如果主要目标是有一个非空坐标的列表,那么您只需要循环遍历您的高度*宽度像素一次。

首先,让我们弄清楚如何从sct_img.raw列表中获取给定像素的RGB值。我在这里做了一些假设,因为我不熟悉你如何解析你的形象。你所需要的数学可能略有不同,但如果我的假设不正确的话,这个方法应该仍然适用。

我的假设是:

  • sct_img.raw是一个(3_width_height)元素数组,其中每个元素三重态表示下一个像素的R值,第一个三重奏描述像素(0,0)。下三个像素(0,1)或换句话说,第一行第二列等
  • 这个数组首先存储R值,然后存储G,然后存储B,然后存储下一个像素的R等等。

这意味着每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)]

最后,我们现在可以通过简单地检查像素在添加之前是否是空的来获得像素列表。

代码语言:javascript
复制
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)]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67243098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档