これはもっと簡単になるだろうと思っていましたが、しばらくして、少なくとも数時間は、ついにこれをあきらめました...
タイムラプスの一連の写真から、これを追跡星の画像で再現したかったのです。これに触発されました:
原作者は、VirtualDubで撮影し、imageJと組み合わせた低解像度のビデオフレームを使用しました。このプロセスを簡単に再現できると思いましたが、Pythonを使用したよりメモリを意識したアプローチで、元の高解像度画像を使用してより良い出力を得ることができました。
私のアルゴリズムのアイデアは単純で、一度に2つの画像をマージし、結果の画像を次の画像とマージすることで反復します。これは数百回行われ、すべての画像が最終結果に同じ貢献をするように適切に計量しました。
私はPythonにかなり慣れていません(そして私はプロのプログラマーではありません、それは明らかです)が、それを見回すとPython Imaging Libraryは非常に標準的であるように見えるので、それを使用することにしました(他の何かが良いでしょう)。
これが私がこれまでに持っているものです:
#program to blend many images into one
import os,Image
files = os.listdir("./")
finalimage=Image.open("./"+files[0]) #add the first image
for i in range(1,len(files)): #note that this will skip files[0] but go all the way to the last file
currentimage=Image.open("./"+files[i])
finalimage=Image.blend(finalimage,currentimage,1/float(i+1))#alpha is 1/i+1 so when the image is a combination of i images any adition only contributes 1/i+1.
print "\r" + str(i+1) + "/" + str(len(files)) #lousy progress indicator
finalimage.save("allblended.jpg","JPEG")
これは想定どおりの動作をしますが、結果の画像は暗くなります。単に強調しようとすると、ピクセル値の深さが不足しているために情報が失われたことは明らかです。(ここでの適切な用語、色深度、色精度、ピクセルサイズはわかりません)。低解像度の画像を使用した最終結果は次のとおりです。
または、4k x 2kのフル解像度で試していたもの(別の写真セットから):
だから、私は画像モードを設定することによってそれを修正しようとしました:
firstimage=Image.open("./"+files[0])
size = firstimage.size
finalimage=Image.new("I",size)
しかし、どうやらImage.blendはその画像モードを受け入れません。
ValueError:画像のモードが間違っています
何か案は?
(また、im.point(lambda i:i * 2)と組み合わせる前に、画像を乗算して「暗くしない」ようにしましたが、結果も同様に悪かったです)