0

2 つの dicom 画像があり、以下のコードを使用して画像の平均二乗誤差を計算できます。ただし、ある画像を別の画像と比較すると固有のずれが生じる可能性があります (イメージャーの位置がわずかにずれている場合)。2 つの numpy 配列のシフトを計算する簡単な方法はありますか?

配列を各方向に数ピクセルずつシフトし、最小 MSQ を計算してみました。ただし、これは十分に堅牢ではありません。ヘルプやアドバイスをいただければ幸いです。

import numpy as np
import dicom

#first image
ds = dicom.read_file("U:\\temp\\1.dcm")
array1 = ds.pixel_array
#second image
ds1 = dicom.read_file("U:\\temp\\5.dcm")
array2 = ds1.pixel_array

#shifting image by a number of pixels in any direction
arr1 = np.roll(array2, 100,  axis=1)
imshow(arr1)

def mse(imageA, imageB):
    # the 'Mean Squared Error' between the two images is the
    # sum of the squared difference between the two images;
    err = np.sum((imageA.astype("float") - imageB.astype("float")) ** 2)
    err /= float(imageA.shape[0] * imageA.shape[1])

    # return the MSE, the lower the error, the more "similar"
    # the two images are
    return err

first_try = mse(array1, array2)
second_try = mse(arr1, array2)
4

2 に答える 2

2

このシフトを除いて画像がまったく同じであると確信している場合、最善の解決策はscipy.signal.correlate2d次のとおりだと思います。

import numpy as np
from scipy.signal import correlate2d

a = np.random.random((200, 200))
b = np.roll(np.roll(a, 15, axis=0),-33, axis=1)

corr = correlate2d(a, b)

shift = np.where(corr==corr.max())
shift = (shift[0]%a.shape[0], shift[1]%a.shape[1])

これにより、正しい値が得られます。

(array([184]), array([32]))
于 2015-04-21T10:10:55.913 に答える
1

画像を見ずして言うのは難しく、ある画像で機能するものが次の画像では機能しない可能性があります. ただし、一般的に試してください:

  • マルチスケール推定 - 配列をダウンサンプリングし、粗いスケールでシフトを計算し、次のスケールでこのシフト (スケーリングを補正) で初期化します。
  • 絶対差の合計のような堅牢なエラー スコア。
于 2015-04-21T10:06:38.753 に答える