在Python中缩小图像的一部分

强制性

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

原始图片是512x512 png

原始图片:

在此处输入图片说明

预期结果:

在此处输入图片说明

实际结果:

在此处输入图片说明

下面是代码片段:

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)您的shrink定义没有用

我知道你要去哪里(x,y)您正在使用它遍历每个较大的块,将所有像素相加,然后除以条目总数,以获得平均RGB像素。您将其设置(0,0)为图像中的每个单个块,因此实际上并没有获得块中的所有像素。您需要使用一对for循环,才能遍历每个块。我还自由地删除了(x,y)输入,然后将所需的大小作为输入输入到函数中。

问题2-输出不是三通道

您初始化了一个二维列表,但是该图像具有三个通道因为您正在使用它numpy来进行计算...为什么不声明一个zerosvia数组np.zeros呢?这样,您不必numpy在完成后转换回数组。我已经更改了输出图像的声明,使其numpy为type数组uint8此转换很重要!

问题#3-无法正确迭代每个子采样的块

正如我们在第1期中所讨论的那样,您没有正确收集每个子采样块的像素。我插入了另外一对for循环为您完成此操作...列举为xy我也删除了它,np.add并习惯于+为您执行操作,因为它更易于阅读。

问题4-除错因素

由于这是您要计算的子样本的平均值,因此必须除以每个块中值的总数。等于scale_factor*scale_factor您只是被所除scale_factor


我也自由地显示了调整大小后的图像并将其保存到文件中。事不宜迟,这里是更正的代码。我还将您的测试代码放在一个__main__块中,以使其更易于测试:

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")

...,我们得到此调整大小的图像:

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章