【问题标题】:How can i iterate over image pixels in a faster manner in python?如何在 python 中以更快的方式迭代图像像素?
【发布时间】:2012-11-19 19:55:57
【问题描述】:

我想以某种方式修改灰度图像,以便可以将图像上半部分的像素值更改为黑色。我当然可以通过像这样的通常方式迭代来做到这一点:

for i in range(0,rows):
  for j in range(0,cols):
    if(condition)
      image[i,j] = 0;

但这很慢,因为我必须进行视频处理。我可以看到我必须使用Image.point(),但我不确定如何实现它。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 你试过 numpy 和数组吗?
  • 条件是什么?是取决于行列索引,还是像素值?
  • 好吧,我只想将图像像素的一半设置为黑色。我只是以显示我的问题的方式编写,而不是实际代码
  • 50% 的黑色像素应该是连续的、随机的还是其他?
  • 连续.. 图像的上半部分。我现在正在经历numpy,是这样的吗? im[:rows/2,:] = 0

标签: python image-processing python-imaging-library


【解决方案1】:

如果先将 PIL 图像转换为 numpy 数组,这会快得多。以下是如何将值低于 10 的所有像素归零:

>>> import numpy as np
>>> arr = np.array(img)
>>> arr[arr < 10] = 0
>>> img.putdata(arr)

或者,正如您在评论中所说,您可以将图像的上半部分涂黑:

>>> arr[:arr.shape[0] / 2,:] = 0

最后,由于您正在处理视频,请注意您也不必遍历各个帧。假设您有十帧 4x4 图像:

>>> arr = np.ones((10,4,4)) # 10 all-white frames
>>> arr[:,:2,:] = 0         # black out the top half of every frame
>>> a
array([[[ 0.,  0.,  0.,  0.],
    [ 0.,  0.,  0.,  0.],
    [ 1.,  1.,  1.,  1.],
    [ 1.,  1.,  1.,  1.]],

   [[ 0.,  0.,  0.,  0.],
    [ 0.,  0.,  0.,  0.],
    [ 1.,  1.,  1.,  1.],
    [ 1.,  1.,  1.,  1.]],
...

【讨论】:

  • 看起来你是对的,但我确实喜欢这个 im[:rows/2,:] = 0
【解决方案2】:

这是对图像进行多重处理的非常好的候选者。如果您将图像分割成像素块,您可以非常轻松地并行处理图像,也就是说,如果它足够大,或者您正在对大量图像执行此操作。

  1. 将图像分解为定义为元组的块(左上 X、左上 Y、宽度、高度)
  2. 将元组和图像句柄传递给各个线程,希望在线程池中。
  3. 等待线程完成,然后继续使用您的图像。

这取决于图像大小以及您选择的线程数和块大小,当然可以线性加速您的进程。

【讨论】:

  • 非常感谢,但是这么简单的任务需要不同的线程吗?不贵吗?
  • 太贵了,为什么我有结尾部分。在我输入它之后,如果您对大量图像执行此操作并且或者图像具有非常大的尺寸,这将是有意义的。
猜你喜欢
  • 2018-01-03
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 2011-12-29
  • 2012-10-11
  • 1970-01-01
  • 2012-05-14
相关资源
最近更新 更多