MATLAB corr2()関数

Ammar Ali 2024年2月15日
MATLAB corr2()関数

このチュートリアルでは、MATLAB の corr2() 関数を使用して 2つの画像間の相関関係を見つける方法について説明します。

MATLAB corr2() 関数

MATLAB の corr2() 関数は、2つの画像または配列間の相関関係を見つけるために使用されます。相関関係は、2つの画像間の類似性に関する情報を提供します。

相関が 1 の場合、2つの画像は同一であり、値がゼロ以下の場合、2つの画像は反対になります。ほとんどの場合、corr2() 関数は 0 から 1 までの浮動小数点値を返します。この値は、2つの画像間の類似性を示します。

corr2() 関数が 0.5 を返す場合、2つの画像の類似度は 50%です。

corr2() 関数の基本的な構文を以下に示します。

correlation_value = corr2(Image_1, Image_2)

上記の構文は、2つの入力画像または配列間の相関を示す数値または相関係数を返します。corr2() 関数の入力は、2D 配列または行列であり、同じサイズである必要があります。

たとえば、MATLAB の corr2() 関数を使用して、2つの画像間の相関関係を見つけましょう。以下のコードを参照してください。

clc
clear

Image = imread('pout.tif');
Filtered_image = medfilt2(Image);
Correlation = corr2(Image,Filtered_image)

出力:

Correlation =

    0.9959

上記のコードでは、imread() 関数を使用して画像を読み取り、次に medfilt2() 関数を使用してメディアンフィルターを画像に適用しました。corr2() 関数を使用して、入力画像とそのフィルター処理されたバージョンとの相関関係を見つけ、結果を出力に表示します。

上記のコードは、2つの画像が 99%類似していることを示しています。2つの同じ画像間の相関が見つかった場合、corr2() 関数は 1 を返します。これは、2つの画像が 100%類似していることを意味します。

次に、2つの画像間の相関関係を見つけるために使用されるアルゴリズムについて説明します。アルゴリズムは、2つの画像に存在するピクセルの強度を比較して、相関関係を見つけます。

アルゴリズムは両方の画像の最初のピクセルから始まり、それらの違いを見つけて、最後のピクセルまで続きます。次に、ピクセル強度のすべての差の平均を取り、相関関係を見つけます。

比較されるピクセルは画像内で同じ位置にあります。つまり、最初の画像の最初のピクセルは 2 番目の画像の最初のピクセルとのみ比較されます。

次の画像は、2つの画像間の相関関係を見つけるために使用される式を示しています。

相関式

上記の式で、mn は行と列を表します。画像は 2D マトリックスのようなものであるため、各ピクセルを取得するには行と列を使用する必要があります。バー付きの文字は、画像マトリックスの平均を表します。

MATLAB では、sum() および mean2() 関数を使用してこの式を記述できます。以下のコードを参照してください。

Image_a = Image_a - mean2(Image_a);
Image_b = Image_b - mean2(Image_b);
correlation = sum(sum(Image_a.*Image_b))/sqrt(sum(sum(Image_a.*Image_a))*sum(sum(Image_b.*Image_b)))

mean2() 関数は、列と行とともに画像行列全体の平均を見つけるために使用されます。mean2() 関数は mean(mean()) 関数と同じです。

単一の mean() 関数を使用すると、各列の平均が検出され、行列に存在する各列の平均値を含むベクトルが返されます。したがって、画像マトリックス全体の単一の平均値を見つけるには、mean() 関数を再度使用する必要があります。

sum() 関数は、合計を見つけるために使用されます。また、単一の sum() 関数は各列の合計のみを計算するため、2 回使用されますが、行列全体の合計を求めます。

sqrt() 関数は、指定された値の平方根を見つけるために使用されます。

corr2() 関数の代わりに上記の式を使用して、2つの画像または配列間の相関を見つけることもできます。たとえば、上記の式を使用して、2つの画像間の相関関係を見つけましょう。

以下のコードを参照してください。

clc
clear

Image_a = imread('pout.tif');
Image_b = medfilt2(Image_a);
Image_a = Image_a - mean2(Image_a);
Image_b = Image_b - mean2(Image_b);
correlation = sum(sum(Image_a.*Image_b))/sqrt(sum(sum(Image_a.*Image_a))*sum(sum(Image_b.*Image_b)))

出力:

correlation =

    0.9983

出力では、相関が corr2() 関数によって返される相関とほぼ等しいことがわかります。corr2() 関数を使用する必要があります。これは、入力ファイルの形式、サイズ、およびその他のエラーをチェックするためです。

1つの画像を回転または変換した場合、回転した画像のピクセル位置が変更されるため、corr2() 関数を使用して 2つの画像を比較することはできません。上で説明したように、corr2() 関数は両方の画像の同じ位置にあるピクセルを比較します。これを使用して、ピクセル位置が変更された 2つの画像間の相関関係を見つけることはできません。

たとえば、corr2() 関数を使用して、画像とその回転バージョンの間の相関関係を見つけましょう。以下のコードを参照してください。

clc
clear

Image = imread('pout.tif');
flipped_image = flip(Image);
Correlation = corr2(Image,flipped_image)

出力:

Correlation =

   -0.1047

上記のコードでは、flip() 関数を使用して、指定された画像を反転しました。上記の出力から、相関関係は 2つの入力画像に類似性がないことを示していることがわかります。それでも、両方の画像が同じであることはわかっています。唯一の違いは、2 番目の画像が反転することです。

したがって、corr2() 関数を使用して、ピクセル位置が変更された 2つの画像を比較することはできません。この場合、人工知能を使用するなど、2つの画像を比較する他の方法が存在します。

corr2() 関数の詳細については、このリンクを確認してください。

著者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

関連記事 - MATLAB Image