ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

imhistmatch

イメージのヒストグラムを調整して参照イメージの N 個のビン ヒストグラムと一致させる

構文

  • B = imhistmatch(A,ref)
  • B = imhistmatch(A,ref,N)
  • [B,hgram] = imhistmatch(___)

説明

B = imhistmatch(A,ref) は、グレースケール イメージまたはトゥルーカラー イメージ A を変換して、両方のヒストグラムで同じ数のビンが使用されている場合に、出力イメージ B のヒストグラムが参照イメージ ref のヒストグラムにほぼ一致するようにします。

  • Aref の両方がトゥルーカラー RGB イメージの場合、imhistmatch は、A の各カラー チャンネルを ref の対応するカラー チャンネルと個別に照合します。

  • A がトゥルーカラー RGB イメージで ref がグレースケール イメージの場合、imhistmatch は、A の各チャンネルを ref から導出される単一のヒストグラムと照合します。

  • A がグレースケール イメージの場合は、ref もグレースケール イメージでなければなりません。

イメージ Aref は、許容される任意のデータ型に設定でき、サイズが同じである必要はありません。

B = imhistmatch(A,ref,N) は、指定されたイメージ データ型の適切な範囲内で、N 個の等間隔のビンを使用します。返されるイメージ B がもつ離散レベルは最大で N までとなります。N の既定値は 64 です。

  • イメージのデータ型が single または double の場合、ヒストグラムの範囲は [0, 1] です。

  • イメージのデータ型が uint8 の場合、ヒストグラムの範囲は [0, 255] です。

  • イメージのデータ型が uint16 の場合、ヒストグラムの範囲は [0, 65535] です。

  • イメージのデータ型が int16 の場合、ヒストグラムの範囲は [-32768, 32767] です。

[B,hgram] = imhistmatch(___) は、参照イメージ ref のヒストグラムを返します。

この参照イメージは HGRAM での照合に使用されます。HGRAM は 1 行 N 列 (REF がグレースケールの場合) または 3 行 N 列 (REF がトゥルーカラーの場合) の行列 (N はヒストグラム ビンの数) です。HGRAM の各行には、REF の 1 つのカラー チャンネルのヒストグラムが格納されます。

すべて展開する

航空イメージのヒストグラム マッチング

ここで示す航空イメージは、マサチューセッツ州コンコードの同じ地域のオーバーラップした眺望を、別々の時間に撮影したものです。この例では、入力イメージ ARef に異なるサイズとイメージ タイプを指定できることを示します。

両方のイメージを読み込みます。

A = imread('concordaerial.png');
Ref = imread('concordorthophoto.png');

イメージ A のサイズを取得します。

size(A)
ans =

        2036        3060           3

参照イメージ Ref のサイズを取得します。

size(Ref)
ans =

       2215        2956

イメージ A とイメージ Ref のサイズとタイプは異なることがわかります。イメージ A はトゥルーカラー RGB イメージですが、イメージ Ref はグレースケール イメージです。データ型はいずれのイメージも uint8 です。

ヒストグラム マッチングされた出力イメージを生成します。この例では、A の各チャンネルを、64 (既定値) 個の等間隔のビンで作成された ref の単一のヒストグラムと一致させます。出力イメージ B はイメージ A の特性を継承し、サイズとデータ型がイメージ A と同じ RGB イメージになります。イメージ B の各 RGB チャンネル内にある異なるレベルの数は、グレースケール イメージ Ref から作成された単一の目標ヒストグラム内のビンの数によって決まり、この場合は 64 です。

B = imhistmatch(A,Ref);

RGB イメージに適用される複数の N 値

この例では、イメージ Ref の目標ヒストグラム内にある等間隔のビンの数 N が、既定値の 64 から uint8 ピクセル データの最大値 256 に変わったとき、出力イメージ B に及ぶ効果を確認します。

以下のイメージは、デジタル カメラを使用して同じシーンを 2 つの異なる露光で撮影したものです。

    A   = imread('office_2.jpg');   % Dark Image
    Ref = imread('office_4.jpg');   % Reference image

暗い方のイメージ A では、下方のビンのピクセルが多くなっています。参照イメージ Ref は適切な露光のイメージです。3 つのどの RGB チャンネルでも、すべての利用可能なビンの値にピクセルが入っています。以下の表に示されているように、3 つのチャンネルすべてが、8 ビットのピクセル値に対して 256 の異なったレベルをもっています。

赤チャンネルの一意の 8 ビット レベル値は、A が 205、ref が 256 です。緑チャンネルの一意の 8 ビット レベル値は、A が 193、ref が 256 です。青チャンネルの一意の 8 ビット レベル値は、A が 224、ref が 256 です。

この例では、3 つの異なる N の値を使用して出力イメージ B を生成します。これらの値は 64、128 および 256 です。関数 imhistmatch の目的は、出力イメージ B のヒストグラムが N 個の等間隔のビンで作成された Ref のヒストグラムと一致するように、イメージ A を変換することです。結果として、N はイメージ B 内にある離散データ レベルの数の上限を表すことになります。

[B64,  hgram] = imhistmatch(A, Ref,  64);   
[B128, hgram] = imhistmatch(A, Ref, 128);
[B256, hgram] = imhistmatch(A, Ref, 256);

N=[64 128 256] の赤チャンネルの一意の 8 ビット レベル値は、出力イメージ B64 が 57、出力イメージ B128 が 101、出力イメージ B256 が 134 です。N=[64 128 256] の緑チャンネルの一意の 8 ビット レベル値は、出力イメージ B64 が 57、出力イメージ B128 が 101、出力イメージ B256 が 134 です。N=[64 128 256] の青チャンネルの一意の 8 ビット レベル値は、出力イメージ B64 が 57、出力イメージ B128 が 101、出力イメージ B256 が 134 です。N が大きくなると、出力イメージ B の各 RGB チャンネルにあるレベルの数も大きくなることに注意してください。

16 ビット グレースケール MRI イメージのヒストグラム マッチング

16 ビットのグレースケール MRI イメージを読み込み、この例で使用するために暗くして、N の 2 つの値でヒストグラム マッチングを実行します。

MRI で撮像した膝の 16 ビット DICOM イメージを読み込みます。

K = dicomread('knee1.dcm');   % read in original 16-bit image
LevelsK = unique(K(:));       % determine number of unique code values
disp(['image K: # levels: ' num2str(length(LevelsK))]);
disp(['max level = ' num2str( max(LevelsK) )]);
disp(['min level = ' num2str( min(LevelsK) )]);
image K: # levels = 448
max level = 473
min level = 0

448 のすべての離散値のコード値が低い (暗い) ので、イメージ データを 16 ビットの範囲 [0 65535] の全体に拡大します。

% Scale it to full 16-bit range
Kdouble = double(K);                  % cast uint16 to double
kmult = 65535/(max(max(Kdouble(:)))); % full range multiplier
Ref = uint16(kmult*Kdouble);   % full range 16-bit reference image

参照イメージを暗くして、ヒストグラム マッチング処理で使用できるイメージ (A) を作成します。

% build concave bow-shaped curve for darkening Reference image
ramp = [0:65535]/65535;
ppconcave = spline([0 .1 .50  .72 .87 1],[0 .025 .25 .5 .75 1]);
Ybuf = ppval( ppconcave, ramp);
Lut16bit = uint16( round( 65535*Ybuf ) );

% pass image Ref through LUT to darken image
A = intlut(Ref,Lut16bit);

2 つのイメージを表示して、それらの離散コード値の数は同じでも全体の明るさが異なることを確認します。

subplot(1,2,1), imshow(A)
title('A: Darkened Image');
subplot(1,2,2), imshow(Ref)
title('Ref: Reference Image')

N の 2 つの値でヒストグラム マッチングされた出力イメージを生成します。1 つ目は既定値の 64 で、2 つ目はイメージ A 内にある値の数 448 です。

B16bit64 = imhistmatch(A(:,:,1),Ref(:,:,1));  % default # bins: N = 64

N = length(LevelsK);      % number of unique 16-bit code values in image A
B16bitUniq = imhistmatch(A(:,:,1),Ref(:,:,1),N);

2 回のヒストグラム マッチング処理の結果を表示します。

figure;
subplot(1,2,1), imshow(B16bit64)
title('B16bit64: N = 64');
subplot(1,2,2), imshow(Ref)
title('B16bitUniq: N = 448')

以下の図は、4 つのイメージすべての 16 ビット ヒストグラムを表しています。Y 軸のスケーリングはプロットに対し同じです。

出力 B のイメージの一意の 16 ビット コード値は、B16bit64 が Levels=63 で N=64、B16bitUniq が Levels=222 で N=448 です。N は上記の出力イメージの離散レベルの上限も表しています。ヒストグラム ビンの数が 64 から 448 に増えているのに対してレベル数は 63 から 222 に増えています。しかし、上のヒストグラム プロットでは、222 のレベルを含む B イメージの、特にヒストグラム範囲の上方部分で、隣接するヒストグラム ビンの間に急激な変動が見られることがわかります。比較すると、63 レベルの B ヒストグラムのほうが、この範囲でのピークの遷移が相対的に滑らかで連続的です。

入力引数

すべて展開する

A — 入力イメージトゥルーカラー イメージ | グレースケール イメージ

変換対象の入力イメージは、トゥルーカラー イメージまたはグレースケール イメージとして指定します。返されるイメージは、入力イメージのデータ型クラスになります。

データ型: single | double | int16 | uint8 | uint16

ref — ヒストグラムが参照ヒストグラムである参照イメージトゥルーカラー イメージ | グレースケール イメージ

ヒストグラムが参照ヒストグラムである参照イメージは、トゥルーカラー イメージまたはグレースケール イメージとして指定します。参照イメージは、出力イメージ B を適合させようとする等間隔の N ビン参照ヒストグラムを提供します。

データ型: single | double | int16 | uint8 | uint16

N — 参照ヒストグラム内の等間隔のビンの数64 (既定値) | スカラー

参照ヒストグラム内の等間隔のビンの数は、スカラー値として指定します。N は、イメージ ref のヒストグラムにおける等間隔のビンの数を指定するだけでなく、出力イメージ B 内にある離散データ レベル数の上限も表します。

データ型: double

出力引数

すべて展開する

B — 出力イメージ トゥルーカラー RGB イメージ | グレースケール イメージ

トゥルーカラー イメージまたはグレースケール イメージとして返される出力イメージです。出力イメージはイメージ A から導出され、そのヒストグラムは、N 個の等間隔のビンで作成された入力イメージ Ref のヒストグラムとほぼ一致します。イメージ B のサイズとデータ型は、入力イメージ A と同じです。入力引数 N は、イメージ B に含まれる離散レベル数の上限を表します。

データ型: single | double | int16 | uint8 | uint16

hgram — 参照イメージ Ref から導出されるヒストグラム数ベクトル | 行列

参照イメージ Ref から導出されるヒストグラム数は、ベクトルまたは行列として指定します。ref がトゥルーカラー イメージの場合、hgram3N 列の行列です。ref がグレースケール イメージの場合、hgram1N 列のベクトルです。

データ型: double

詳細

すべて展開する

アルゴリズム

imhistmatch の目的は、イメージ B のヒストグラムがイメージ Ref から導出されるヒストグラムと一致するように、イメージ A を変換することです。ヒストグラムは、イメージのデータ型の全範囲にわたる N 個の等間隔のビンで構成されます。このようにヒストグラムを一致させる結果として、N はイメージ B にある離散データ レベルの数の上限も表すことになります。

このアルゴリズムには注意すべき重要な動作特性があります。N の値が増えると、イメージ B のヒストグラムにおける隣接するピーク間で急激な変動の度合いが高くなる傾向があるということです。これは、16 ビット グレースケール MRI の例から作成した以下のヒストグラム プロットで確認できます。

N の最適値は、より多くの出力レベル (より大きな値の N) と、ヒストグラムにおけるピーク変動の最小化 (より小さい値の N) との間の妥協点となります。

参考

| |

この情報は役に立ちましたか?