在python枕头堆叠多个图像

时间:2016-01-06 01:43:17

标签: python image pillow

我正在尝试在python枕头中进行一些图像堆叠。我想做的是拍摄大量图像(比如说10个),然后对于每个像素,取像这样的中值:http://petapixel.com/2013/05/29/a-look-at-reducing-noise-in-photographs-using-median-blending/

现在,我可以用令人难以置信的蛮力方式(使用getpixel和put pixel)来实现,但这需要很长时间。

这是我到目前为止所做的:

import os
from PIL import Image
files = os.listdir("./")
new_im = Image.new('RGB', (4000,3000))
ims={}
for i in range(10,100):
    ims[i]={}           
    im=Image.open("./"+files[i])
    for x in range(400):
        ims[i][x]={}            
        for y in range(300):
            ims[i][x][y]=im.getpixel((x,y))

for x in range(400):
    for y in range(300):
        these1=[]
        these2=[]
        these3=[]
        for i in ims:
            these1.append(ims[i][x][y][0])
            these2.append(ims[i][x][y][1])
            these3.append(ims[i][x][y][2])
        these1.sort()
        these2.sort()
        these3.sort()
        new_im.putpixel((x,y),(these1[len(these1)/2],these2[len(these2)/2],these3[len(these3)/2]))

new_im.show()

1 个答案:

答案 0 :(得分:2)

你可以使用数组来渲染很多这些循环。例如,np.array(im)将返回像素数组,其形状为(400,300,3)。所以将所有内容存储在一个数组中。

image_stacks = np.zeros(shape=(10, 400, 300, 3), dtype=np.uint8)
for i in xrange(image_stacks.shape[0]):
    # open image file and store in variable `im`, then
    image_stacks[i] = np.array(im)

现在你可以用你喜欢的方式计算中位数,但numpy也有method

image_median = np.median(image_stacks, axis=0).astype(np.uint8)
image = Image.fromarray(image_median)

这里需要注意的两件事是np.median()将返回一个float类型数组,我们希望将其转换为unsigned int8。另一件事是,如果元素的数量是偶数,则将中值计算为两个中间值的平均值,这可能最终是奇数除以2,例如13.5。但是当它转换为整数时,它将向下舍入。这种微小的精确损失不应在视觉上影响您的结果。