我正在尝试在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()
答案 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。但是当它转换为整数时,它将向下舍入。这种微小的精确损失不应在视觉上影响您的结果。