私はフォルダ内にたくさんの画像を持っていますが、それらは事実上、重なり合う部分に分割された1つの画像の断片にすぎません。これらの画像をすばやくプログラムで再結合して元の画像を作成するにはどうすればよいですか?
私はpythonまたはmathematicaを使用する(または既存のアプリケーションである)ソリューションを好みますが、他のアイデアも受け入れます(私はJavaにかなり精通しています)。
私はフォルダ内にたくさんの画像を持っていますが、それらは事実上、重なり合う部分に分割された1つの画像の断片にすぎません。これらの画像をすばやくプログラムで再結合して元の画像を作成するにはどうすればよいですか?
私はpythonまたはmathematicaを使用する(または既存のアプリケーションである)ソリューションを好みますが、他のアイデアも受け入れます(私はJavaにかなり精通しています)。
私はこの答えが非常に遅いことに気づきましたが、私はこの問題をグーグルで調べるのに時間を費やしたので、Pythonを使用してかなり単純な解決策を投稿すると思いました。
import cv2
#works in version 4.2
cv2.__version__
#mode=0 photos, mode=1 scans
stitcher = cv2.Stitcher.create(mode=1)
img1 = cv2.imread("frame-0021.png")
img2 = cv2.imread("frame-0022.png")
result = stitcher.stitch((img1, img2))
cv2.imwrite("stitched.png", result[1])
さて、私はもうやりたいことをするためにこれをする必要はありませんが、Python(擬似コードとpythonの混合)でそれを書く場合にこれをどのように行うかを共有します。ここでは、後続の画像の左上隅が常にオーバーラップのポイントであると想定しています(これは私の場合に当てはまりました)。いずれかのコーナーのオーバーラップを検出する場合は、現在の「コーナー」ケースを検出し、各ケースの処理を追加する必要があります。
images = list of images to be stitched, loaded from directory
stitched_image = images[0]
for (image in images):
if first image then skip it (continue)
else combine_images(stitched_image, image)
def combine_images (stitched_image, image_to_add):
top_left_corner = top left corner of image_to_add
// top_left_corner dimensions need to be big enough that you don't have a false positive,
// but not so big that the overlap doesn't exist
coordinates = find_coordinates(stitched_image,top_left_corner)
new_width = max(stitched_image.width,image_to_add.width + coordinates.x)
new_height = max(stitched_image.height,image_to_add.width + coordinates.y)
new_image = new Image(new_width,new_height) // See note 1
new_image.paste(stitched_image,(0,0))
new_image.paste(image_to_add,(coordinates.x,coordinates.y))
stitched_image = new_image
def find_coordinates (image,sub_image):
// See note 2 below for how to implement
ノート:
画像の作成と貼り付けは、PILを使用して実行できます:http://29a.ch/2009/5/14/concatenating-images-using-python
画像内のsub_imageを見つける方法については、この質問を参照してください(画像を別の表現に変換する必要がある場合があります):Numpy画像内のサブ画像を見つける。また、熟練したプログラマーにとって、ピクセルのマトリックス内のピクセルを手動で検査してオーバーラップを見つけることはまったく難しいことではありません。最初に可能性の高い領域を検索するだけで、オーバーラップが発生する可能性のある場所が大まかにわかっている場合は、さらに最適化を追加できます。
Autopanoまたは同様のものを使用できます。自分でロールしたい場合は、SIFTアルゴリズムが役立つことがありますhttp://www.janeriksolem.net/2009/02/sift-python-implementation.html?m=1
必要なのは、パノラマを作成するためのツールです。さまざまな機能でこれを行うために販売されているさまざまなツールがあります。考えるべきことは次のとおりです。
Java固有のソリューションを使用するつもりですか?あなたが何か他のことにオープンであるなら、私はプロジェクトのために同様のことをしていて、Linux用に設定されたbashスクリプトを思いついた。
これを行うために、私は使用しました
pto_gen
は、huginをインストールした後は存在しませんがmatch-n-shift
、Panotoolsスクリプトで置き換えられます。複数のパノラマを順番にバッチ処理する場合は、ファイルを並べ替え、実行し、移動する方法を考え出す必要があります。それは私のスクリプトプロセスの楽しい部分でした。写真をつなぎ合わせるのは簡単で、後で正しい場所に移動するのを確認するのは少し注意が必要でした。
現在、4 GBのRAMを備えた4コアのXeonシステムを使用して、50枚の画像を360度のパノラマでつなぎ合わせるのに約30〜45分かかります。
Mathematicaでは、オーバーラップ領域内でImageCorrespondingPointsを使用してから、FindGeometricTransformを使用して、一方の画像をもう一方の画像に取り込むアフィン変換を計算できます。画像とオーバーラップ領域のサイズが変換の精度に影響することに注意してください。複雑なこと(衛星画像の組み合わせなど)を行う場合は、結果の全体的な幾何学的モデルが必要になり、各画像をそれにマッピングします。このような場合、アフィン変換では不十分な場合があります。