gpt4 book ai didi

python - 在Python中缩小图像的一部分

转载 作者:太空宇宙 更新时间:2023-11-03 17:37:01 24 4
gpt4 key购买 nike

我正在尝试从 (x,y) 坐标开始缩小图像的一部分,并将宽度和高度为 500 调整为 40x40。通过这样做,我将周围的像素平均为一个。 (我能找到的最简单的方法)但结果很奇怪。

原始图像是 512x512 png

原始图片:

enter image description here

预期结果:

enter image description here

实际结果:

enter image description here

下面是代码片段:

from PIL import Image
import numpy as np


defined_size = 40
img = Image.open("lena.png")
pix = np.array(img)
changed_img = shrink(pix, 0, 0, 500)
changed_img = np.array(changed_img)
resized = Image.fromarray(changed_img, 'RGB')

def shrink(img, x, y, size):
result = [[0 for width in xrange(defined_size)] for height in xrange(defined_size)]

scale_factor = size/defined_size
for i in xrange(defined_size):
for j in xrange(defined_size):
temp = np.array([0,0,0])
for t in xrange(scale_factor):
print img[i*scale_factor+x, j*scale_factor+y]
temp = np.add(temp, img[i*scale_factor+x, j*scale_factor+y])
result[i][j] = np.divide(temp, scale_factor)
print result[i][j]

return result

最佳答案

您的代码存在几个问题。让我们一次解决一个问题:

问题 #1 - (x,y) 在您的 shr​​ink 定义中毫无用处

我知道您要使用(x,y)。您可以使用它遍历每个较大的 block ,将所有像素相加并除以条目总数以获得平均 RGB 像素。对于图像中的每个 block ,您都将其设置为 (0,0),因此您实际上并未获取该 block 中的所有像素。您需要使用一对 for 循环来遍历每个 block 。我还冒昧地删除了 (x,y) 输入,并将所需的大小作为输入放入函数中。

问题 #2 - 输出不是三 channel

您初始化了一个二维列表,但图像具有三个 channel 。因为您使用 numpy 来为您进行计算...为什么不通过 np.zeros 声明一个由 0 组成的数组> 首先?这样,完成后就不必转换回 numpy 数组。我更改了输出图像的声明,使其成为 uint8 类型的 numpy 数组。这个选角很重要!

问题#3 - 没有正确迭代每个子采样 block

正如我们在问题 #1 中讨论的那样,您没有正确收集每个子采样 block 的像素。我插入了另一对 for 循环来为您执行此操作...枚举为 xy。我还删除了 np.add 并使用 + 为您执行操作,因为它更易于阅读。

问题 #4 - 除以错误的因子

因为它是您尝试计算的子样本的平均值,所以您必须除以每个 block 内的值总数。这等于scale_factor*scale_factor。您仅除以 scale_factor

<小时/>

我还冒昧地展示了调整大小的图像并将其保存到文件中。事不宜迟,这是更正后的代码。我还将您的测试代码放在 __main__ block 中,以便于测试:

from PIL import Image
import numpy as np

def shrink(img, size, defined_size): # Change - Issue #1
result = np.zeros((defined_size, defined_size, 3), dtype=np.uint8) # Change - Issue #2

scale_factor = size/defined_size
for i in xrange(defined_size):
for j in xrange(defined_size):
temp = np.array([0,0,0])
for x in xrange(scale_factor): # Change - Issue #3
for y in xrange(scale_factor): # Change - Issue #3
temp += img[i*scale_factor + x, j*scale_factor + y] # Change - Issue #3

result[i,j] = temp / (scale_factor*scale_factor) # Change

return result

if __name__ == '__main__':
img = Image.open("lena.png")
pix = np.array(img)
changed_img = shrink(pix, 512, 40) # Change - Issue #1
resized = Image.fromarray(changed_img, 'RGB')
resized.show() # Change
resized.save("lena_resize.png")

...我们得到了这个调整大小的图像:

enter image description here

关于python - 在Python中缩小图像的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31082904/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com