如何将数据从序列中放入图像中

时间:2012-02-25 02:07:35

标签: python numpy python-imaging-library

如何将一个图像的序列(原始)数据放入另一个具有不同大小的图像中? 视觉效果应该是crop方法之一,但数据应该作为原始数据

...
sequence = image1.getdata()
size=(int(image1.size[0]/2),int(image1.size[1]/2))
image2 = Image.new(image1.mode, size, "black")
seq_in=[]
for i in xrange(len(sequence)):
      seq_in.append(sequence[i])
seq_out=transform_data(seq_in,size,image1.size)
image2.putdata(seq_out)
...

以下2个变换变体给出了不同的结果,但没有预期的那样

transform_data(seq_in,size,size_in):

#seq_t=do_something_with_the_data(seq_in)
seq_t=seq_in

seq_out=[]
#A:
sz=size[0]*size[1]
for i in xrange(sz):
      seq_out.append((seq_t[i]))
# end A
#B:
seq_r = numpy.array(seq_t).reshape(size_in[0],size_in[1],3)

for i in xrange(size[0]):
   for j in xrange(size[1]):
      seq_out.append((seq_r[i][j][0], seq_r[i][j][1], seq_r[i][j][2]))
#end B

return seq_out

1 个答案:

答案 0 :(得分:2)

你让我们很难弄清楚你想要做什么(特别是因为你已经告诉我们你所包含的代码不起作用)。但这就是我做作物的方式:

from PIL import Image
import numpy as np

size = image1.size
size = [i//2 for i in size]
array1 = np.asarray(image1)
array2 = array1[:size[1], :size[0]]
image2 = Image.fromarray(array2)

请注意,如果image1具有大小(x,y),则array1具有形状(y,x,3)。如果您需要将array2中的值放入现有图像中,我认为最简单的方法是:

image2.fromstring(array2.tostring())

同样在你的代码中sequence已经是一个“序列”(或者如果你想成为技术人员,那么它是可迭代的)所以你不需要创建一个seq_in,但如果你真的想让序列为列表,您可以seq_in = list(sequence)

我仍然不太明白你遇到的问题,但也许这个例子有助于澄清问题:

image1 = Image.open("img1.jpg")
array1 = np.asarray(image1)
array2 = np.fft.fftn(array1)
array2_uint = (np.log(np.abs(array2)) * 14).astype('uint8')
image2 = Image.fromarray(array2_uint)
array3 = np.fft.ifftn(array2).astype('uint8')
image3 = Image.fromarray(array3)

IMAGE1

image1

图像2

image2

的Image3

image3

如您所见,array2_uint和array3都正确转换为图像。您是否可以尝试解释您遇到的问题,如果输出错误,可能会更新问题中的代码以包含示例或输出错误。