我想以某种方式修改灰度图像,以便可以将图像上半部分的像素值更改为黑色。我当然可以通过像这样的通常方式迭代来做到这一点:
for i in range(0,rows):
for j in range(0,cols):
if(condition)
image[i,j] = 0;
但这很慢,因为我必须进行视频处理。我可以看到我必须使用Image.point()
,但我不确定如何实现它。有人可以帮我解决这个问题吗?
我想以某种方式修改灰度图像,以便可以将图像上半部分的像素值更改为黑色。我当然可以通过像这样的通常方式迭代来做到这一点:
for i in range(0,rows):
for j in range(0,cols):
if(condition)
image[i,j] = 0;
但这很慢,因为我必须进行视频处理。我可以看到我必须使用Image.point()
,但我不确定如何实现它。有人可以帮我解决这个问题吗?
如果先将 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.]],
...
这是多处理图像的一个很好的候选者。如果您将图像分割成像素块,您可以非常轻松地并行处理图像,也就是说,如果它足够大,或者您正在对大量图像执行此操作。
这取决于图像大小以及您选择的线程数和块大小,当然可以线性加速您的过程。