ドキュメンテーション

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

imhistmatch

参照イメージのヒストグラムに一致させるために 2 次元イメージのヒストグラムを調整

構文

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

説明

B = imhistmatch(A,ref) は、2 次元のグレースケール イメージまたはトゥルーカラー イメージ A を変換して、ヒストグラムが参照イメージ ref のヒストグラムにほぼ一致する出力イメージ B を返します。

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

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

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

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

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

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

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

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

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

[B,hgram] = imhistmatch(___) は、マッチングに使用された参照イメージ ref のヒストグラムを hgram に返します。hgram は 1 行 nbins 列 (ref がグレースケールの場合) または 3 行 nbins 列 (ref がトゥルーカラーの場合) の行列です。nbins はヒストグラムのビン数です。hgram の各行には、ref の 1 つのカラー チャネルのヒストグラムが格納されます。

すべて折りたたむ

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

RGB イメージと参照グレースケール イメージを読み込みます。

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

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

size(A)
ans = 

        2036        3060           3

Ref のサイズを取得します。

size(Ref)
ans = 

        2215        2956

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

ヒストグラム マッチングされた出力イメージを生成します。この例では、Ref の 1 つのヒストグラムに対して A の各チャネルをマッチングします。出力イメージ B はイメージ A の特性を継承し、サイズとデータ型がイメージ A と同じ RGB イメージになります。イメージ B の各 RGB チャネル内にある個別のレベルの数は、グレースケール イメージ Ref から作成されたヒストグラムのビン数と同じです。この例の RefB のヒストグラムには既定の 64 個のビン数があります。

B = imhistmatch(A,Ref);

RGB イメージ A、参照イメージ Ref およびヒストグラム マッチングされた RGB イメージ B を表示します。イメージはサイズを変更してから表示します。

figure
imshow(imresize(A, 0.25))
title('RGB Image with Color Cast')

figure
imshow(imresize(Ref, 0.25))
title('Reference Grayscale Image')

figure
imshow(imresize(B, 0.25))
title('Histogram Matched RGB Image')

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

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

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

この例では、異なるビン数を使用してヒストグラム マッチングを行う方法を説明します。

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: ',num2str(length(LevelsK)),' distinct levels']);
image K: 448 distinct levels
disp(['max level = ' num2str( max(LevelsK) )]);
max level = 473
disp(['min level = ' num2str( min(LevelsK) )]);
min level = 0

448 個の離散値すべてのコード値が低いため、イメージは暗く見えます。これを修正するため、イメージ データを 16 ビットの範囲全体の [0, 65535] に広がるようにスケーリングします。

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

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

%Build concave bow-shaped curve for darkening |Ref|.
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 a lookup table (LUT) to darken the image.
A = intlut(Ref,Lut16bit);

参照イメージ Ref と暗くしたイメージ A を表示します。離散コード値の数は同じでも全体の明るさが異なることに注意してください。

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

ビン数が異なるヒストグラムを使用してヒストグラム マッチングの出力イメージを生成します。最初に、既定のビン数 64 を使用し、次にイメージ A 内にある値の数 448 を使用します。

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

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: 64 bins')
subplot(1,2,2)
imshow(Ref)
title(['B16bitUniq: ',num2str(N),' bins'])

入力引数

すべて折りたたむ

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

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

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

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

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

データ型: double

出力引数

すべて折りたたむ

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

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

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

データ型: double

アルゴリズム

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

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

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

R2012b で導入

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