【发布时间】:2020-08-23 05:53:33
【问题描述】:
我已经开始使用图像,目前我正在尝试重新缩放和灰度图像(尺寸 6000x4000 -> 600x400)以更好地使用它。为此,我使用 Numpy 和 PIL.Images。
import PIL.Image as Img
import numpy as np
img = Img.open('rendering/testpic.jpg', 'r')
r, g, b = img.split()
channels = np.array([np.array(r), np.array(g), np.array(b)])
small_channels = []
for channel in channels:
x_len = len(channel)//10
y_len = len(channel[0])//10
for chunk_x in range(x_len):
for chunk_y in range(y_len):
pix_sum = 0
for x_in_chunk in range(10):
for y_in_chunk in range(10):
pix_sum += channel[chunk_x*10+x_in_chunk,chunk_y*10+y_in_chunk]
channel[chunk_x,chunk_y] = pix_sum // 100
small_channels.append(channel[:x_len,:y_len])
channels = np.array(small_channels)
grayscale = np.round((channels[0]*0.3+ channels[1]*0.6+ channels[2]*0.1)).astype('uint8')
pixels = np.stack([grayscale, grayscale, grayscale], axis = 2)
new_img = Img.fromarray(pixels)
new_img.show()
所以我正在做的是将通道分成大小为 10 的块,然后将块的平均值映射到左上角。最后我把图片的其余部分剪掉了。
对我来说,这总共需要大约 100 到 130 秒。有没有更快的方法来做到这一点?我哪里效率低了?我是新手,所以我可能做错了很多事情。例如,Photoshop 是如何快速放大和缩小图片的?
【问题讨论】:
-
预期结果是什么?
-
你应该考虑
OpenCV,据报道它比PIL快得多。 -
@sk500 正如我所说,它应该将图像重新缩放到其原始大小的十分之一。
-
对于使用 numpy 进行灰度化,您可能想在此处查看我的答案:stackoverflow.com/a/65919555/6342392,这种方法需要 0.026 秒才能运行
标签: python arrays image performance numpy