Main Content

imhistmatch

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

説明

J = imhistmatch(I,ref) は、ヒストグラムが参照イメージ ref のヒストグラムにほぼ一致するように、2 次元のグレースケール イメージまたはトゥルーカラー イメージ I のヒストグラムを調整します。

  • Iref の両方が RGB イメージの場合、imhistmatch は、I の各カラー チャネルを ref の対応するカラー チャネルに個別に一致させます。

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

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

イメージ Iref は、サイズが同じである必要はありません。

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

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

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

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

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

J = imhistmatch(___,Method=method) は、さらに、一様マッピング手法と多項式マッピング手法のどちらを使用するかを指定します。

[J,hgram] = imhistmatch(___) は、マッチングに使用された参照イメージ ref のヒストグラムを hgram に返します。

すべて折りたたむ

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

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

A = imread("westconcordaerial.png");
Ref = imread("westconcordorthophoto.png");

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

size(A)
ans = 1×3

   394   369     3

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

size(Ref)
ans = 1×2

   366   364

イメージ 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 を表示します。イメージはサイズを変更してから表示します。

imshow(A)
title("RGB Image with Color Cast")

imshow(Ref)
title("Reference Grayscale Image")

imshow(B)
title("Histogram Matched RGB Image")

カラー イメージと参照イメージを読み取ります。多項式法のデモを実行するには、参照イメージを 2 つのイメージの暗い方に割り当てます。

I = imread('office_4.jpg');
ref = imread('office_2.jpg');
montage({I,ref})
title('Input Image (Left) vs Reference Image (Right)');

多項式法を使用して、イメージ I の強度を、参照イメージ ref のヒストグラムに一致するように調整します。比較のため、一様手法を使用してイメージ I の強度も調整します。

J = imhistmatch(I,ref,'method','polynomial');
K = imhistmatch(I,ref,'method','uniform');
montage({J,K})
title('Histogram-Matched Image Using Polynomial Method (Left) vs Uniform Method (Right)');

一様手法を使用したヒストグラム マッチ イメージでは、空や道にフォールス カラーが入ります。多項式法を使用したヒストグラム マッチ イメージではこのアーティファクトは現れません。

この例では、ターゲット ヒストグラムのビン数を変更して、ヒストグラム均等化を改善する方法を説明します。

データ型 uint8 の 2 つのイメージをワークスペースに読み込みます。イメージは、デジタル カメラを使用して同じシーンを 2 つの異なる露光で撮影したものです。A は露光不足のイメージであり、暗く見えます。ref は参照イメージであり、露光が適切で明るいです。

A = imread('office_2.jpg');
ref = imread('office_4.jpg');

イメージをモンタージュに表示します。

montage({A,ref})
title('Dark Image (Left) and Reference Image (Right)')

256 個のビンを使用して、各カラー チャネルのヒストグラムを表示します。この例に含まれている補助関数 displayHistogramChannels を使用できます。

displayHistogramChannels(A,ref)

暗い方のイメージ A では、ほとんどのピクセルが下方のビンにあります。参照イメージ ref では、3 つのどの RGB チャネルでも、256 個すべてのビンの値にピクセルが入っています。

暗いイメージと参照イメージの各カラー チャネルにおける一意の 8 ビット レベル値の数をカウントします。この例に含まれている補助関数 countUniqueValues を使用できます。

numVals = countUniqueValues(A,ref);
table(numVals(:,1),numVals(:,2),numVals(:,3), ...
  'VariableNames',["Red" "Green" "Blue"], ...
  'RowNames',["A" "ref"])
ans=2×3 table
           Red    Green    Blue
           ___    _____    ____

    A      205     193     224 
    ref    256     256     256 

nbins の次の 3 つの値を使用して、暗いイメージのヒストグラムを均等化します。64、128、および 256。64 は既定のビン数であり、256 は uint8 ピクセル データの最大ビン数です。

[B64,hgram64]   = imhistmatch(A,ref,64);   
[B128,hgram128] = imhistmatch(A,ref,128);
[B256,hgram256] = imhistmatch(A,ref,256);

figure
montage({B64,B128,B256},'Size',[1 3])
title('Output Image B64  |  Output Image B128  |  Output Image B256')

256 個のビンを使用して、各カラー チャネルのヒストグラムを表示します。この例に含まれている補助関数 displayThreeHistogramChannels を使用できます。

displayThreeHistogramChannels(B64,B128,B256)

ヒストグラム均等化を行った 3 つのイメージの各カラー チャネルにおける一意の 8 ビット レベル値の数をカウントします。nbins が大きくなると、出力イメージ B の各 RGB チャネルにあるレベルの数も大きくなります。

numVals = countUniqueValues(B64,B128,B256);
table(numVals(:,1),numVals(:,2),numVals(:,3), ...
  'VariableNames',["Red" "Green" "Blue"], ...
  'RowNames',["B64" "B128" "B256"])
ans=3×3 table
            Red    Green    Blue
            ___    _____    ____

    B64      57      60      58 
    B128    101     104     104 
    B256    134     135     136 

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

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 次元 RGB イメージまたは 2 次元グレースケール イメージとして指定します。関数 imhistmatch では、データ型が double および single であるイメージの値の範囲は [0, 1] でなければなりません。I が [0, 1] の範囲外の値をもつ場合、関数 rescale を使用して、想定される範囲に値を再スケーリングできます。

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

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

関数 imhistmatch では、データ型が double および single であるイメージの値の範囲は [0, 1] でなければなりません。

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

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

ref のヒストグラムをイメージ I にマッピングする手法。次のいずれか値として指定します。

  • "uniform" — ヒストグラムをベースにした強度関数とヒストグラム均等化を使用します

  • "polynomial" — ソース イメージと参照イメージの累積ヒストグラムから 3 次エルミート多項式マッピング関数を計算します。多項式法は参照イメージが入力イメージよりも暗い場合に役に立ちます。この状況では、多項式法は、一様手法よりも色の遷移が滑らかになります。

出力引数

すべて折りたたむ

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

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

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

データ型: double

アルゴリズム

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

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

For the same input image, peaks of the histogram with 64 bins follow a smoother curve than peaks of the histogram with 448 bins.

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

バージョン履歴

R2012b で導入