我正在尝试从(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
您的代码有几个问题。让我们一次解决一个问题:
(x,y)
您的shrink
定义没有用我知道你要去哪里(x,y)
。您正在使用它遍历每个较大的块,将所有像素相加,然后除以条目总数,以获得平均RGB像素。您将其设置(0,0)
为图像中的每个单个块,因此实际上并没有获得块中的所有像素。您需要使用一对for
循环,才能遍历每个块。我还自由地删除了(x,y)
输入,然后将所需的大小作为输入输入到函数中。
您初始化了一个二维列表,但是该图像具有三个通道。因为您正在使用它numpy
来进行计算...为什么不先声明一个zeros
via数组np.zeros
呢?这样,您不必numpy
在完成后转换回数组。我已经更改了输出图像的声明,使其numpy
为type数组uint8
。此转换很重要!
正如我们在第1期中所讨论的那样,您没有正确收集每个子采样块的像素。我插入了另外一对for
循环为您完成此操作...列举为x
和y
。我也删除了它,np.add
并习惯于+
为您执行操作,因为它更易于阅读。
由于这是您要计算的子样本的平均值,因此必须除以每个块中值的总数。等于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] 删除。
我来说两句