6

私はフォルダ内にたくさんの画像を持っていますが、それらは事実上、重なり合う部分に分割された1つの画像の断片にすぎません。これらの画像をすばやくプログラムで再結合して元の画像を作成するにはどうすればよいですか?

私はpythonまたはmathematicaを使用する(または既存のアプリケーションである)ソリューションを好みますが、他のアイデアも受け入れます(私はJavaにかなり精通しています)。

4

6 に答える 6

2

私はこの答えが非常に遅いことに気づきましたが、私はこの問題をグーグルで調べるのに時間を費やしたので、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])
于 2020-03-26T12:01:49.277 に答える
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

ノート:

  1. 画像の作成と貼り付けは、PILを使用して実行できます:http://29a.ch/2009/5/14/concatenating-images-using-python

  2. 画像内のsub_imageを見つける方法については、この質問を参照してください(画像を別の表現に変換する必要がある場合があります):Numpy画像内のサブ画像を見つける。また、熟練したプログラマーにとって、ピクセルのマトリックス内のピクセルを手動で検査してオーバーラップを見つけることはまったく難しいことではありません。最初に可能性の高い領域を検索するだけで、オーバーラップが発生する可能性のある場所が大まかにわかっている場合は、さらに最適化を追加できます。

于 2012-06-24T21:42:08.390 に答える
0

Autopanoまたは同様のものを使用できます。自分でロールしたい場合は、SIFTアルゴリズムが役立つことがありますhttp://www.janeriksolem.net/2009/02/sift-python-implementation.html?m=1

于 2012-06-24T03:40:37.780 に答える
0

必要なのは、パノラマを作成するためのツールです。さまざまな機能でこれを行うために販売されているさまざまなツールがあります。考えるべきことは次のとおりです。

  1. 垂直方向と水平方向に一致する位置
  2. 画像間で明るさを変える
  3. カメラの回転と角度を補正する
于 2012-06-24T03:47:46.170 に答える
0

Java固有のソリューションを使用するつもりですか?あなたが何か他のことにオープンであるなら、私はプロジェクトのために同様のことをしていて、Linux用に設定されたbashスクリプトを思いついた。

これを行うために、私は使用しました

  1. UbuntuリポジトリのHuginとhugin-tools
  2. Panotoolsperlラッパースクリプト
  3. このガイドは、コマンドラインを介して生成機能を機能させるためのものです。この例でpto_genは、huginをインストールした後は存在しませんがmatch-n-shift、Panotoolsスクリプトで置き換えられます。

複数のパノラマを順番にバッチ処理する場合は、ファイルを並べ替え、実行し、移動する方法を考え出す必要があります。それは私のスクリプトプロセスの楽しい部分でした。写真をつなぎ合わせるのは簡単で、後で正しい場所に移動するのを確認するのは少し注意が必要でした。

現在、4 GBのRAMを備えた4コアのXeonシステムを使用して、50枚の画像を360度のパノラマでつなぎ合わせるのに約30〜45分かかります。

于 2012-06-24T04:45:39.460 に答える
0

Mathematicaでは、オーバーラップ領域内でImageCorrespondingPointsを使用してから、FindGeometricTransformを使用して、一方の画像をもう一方の画像に取り込むアフィン変換を計算できます。画像とオーバーラップ領域のサイズが変換の精度に影響することに注意してください。複雑なこと(衛星画像の組み合わせなど)を行う場合は、結果の全体的な幾何学的モデルが必要になり、各画像をそれにマッピングします。このような場合、アフィン変換では不十分な場合があります。

于 2012-06-27T05:15:59.957 に答える