我有以下代码
import numpy as np
from matplotlib import pyplot as plt
from PIL import Image as im
B = 9
pic = np.array(im.open('portrait.png'))
pic = pic[pic.shape[0] % B:, pic.shape[1] % B:, :3]
reduced, _i, _j = [], 0, 0
for i in range(B, pic.shape[0] + B, B):
for j in range(B, pic.shape[1] + B, B):
pix = pic[_i:i, _j:j].reshape(B * B, 3).mean(axis=0)
reduced.append(pix.astype(np.uint8))
_j = j
_i, _j = i, 0
reduced = np.array(reduced)
reduced = reduced.reshape((pic.shape[0] // B, pic.shape[1] // B, 3))
plt.title(reduced.shape)
plt.imshow(reduced)
plt.show()
它本质上是通过B
对图像的B
块进行迭代,并通过取其平均值将它们变成一个像素。
所以这个
变成了这样,
我认为这可以通过改变形状来实现,沿着某个轴取平均值,然后再次改变形状,但我不确定如何消除这个循环。
2条答案
按热度按时间p4tfgftt1#
您可以在图像中引入
BxB
块作为额外的轴,然后沿着这些轴取平均值:slmsl1lt2#
如果您不介意使用额外的库,可以使用
einops
以一种直接和自我解释的方式实现它,如下所示: