首页 > 解决方案 > 如何调整图像大小但保留图像中的特征?Python

问题描述

我有一个看起来像这样的图像:在此处输入图像描述

    array.resize(20,20,3)

    img = Image.fromarray(array, 'RGB')
    img.save('my.png',quality=90)

    img.show()

它目前是一个 500x500x3 的 NumPy 数组。底层空间是一个 20x20 的单元格网格,我想调整图像的大小,以便每个网格单元格在 20x20x3 NumPy 数组中都有与其 RGB 值相对应的条目,而不是 (500/20)*(500/20)*3 个条目细胞。

不幸的是,上面的代码似乎不起作用,因为它似乎给每个单元格提供了比我预期的更多的条目,尽管我不是 100% 确定。

标签: pythonimagenumpyencoding

解决方案


要调整图像大小,pillow可以使用Image.resize()

from PIL import Image
import urllib.request
import numpy as np

data = urllib.request.urlopen('https://i.stack.imgur.com/7bPlZ.png')
old_img = Image.open(data)

new_img = old_img.resize((20, 20))
new_img.save('my.png',quality=90)
new_img.show()

array = np.array(new_img)

print(array)

但是调整图像大小可以创建带有半色调的像素。

也许你应该直接从numpy.array. 您有纯色,因此您可以从每个单元格中获取单个像素 - 因为每个单元格都有大小25x25,所以它可能是:

new_array = old_array[::25,::25,:]

然后您不必转换为图像。

如果您将此数组转换为图像,那么它应该比 create with 更清晰Image.resize

在此处输入图像描述

from PIL import Image
import urllib.request
import numpy as np

data = urllib.request.urlopen('https://i.stack.imgur.com/7bPlZ.png')
old_img = Image.open(data)

old_array = np.array(old_img)

new_array = array[::25,::25,:]

print(new_array)

new_img = Image.fromarray(new_array)
new_img.save('my.png',quality=90)
new_img.show()

推荐阅读