Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

histeq

ヒストグラム均等化を使用したコントラストの強調

説明

J = histeq(I) は、64 ビンを持つ出力グレースケール イメージ J のヒストグラムがほぼフラットになるように、グレースケール イメージ I を変換します。

J = histeq(I,n) は、n ビンを持つ出力グレースケール イメージ J のヒストグラムがほぼフラットになるように、グレースケール イメージ I を変換します。J のヒストグラムは nI の離散レベル数よりはるかに少ないときに、よりフラットになります。

J = histeq(I,hgram) は、出力グレースケール イメージ J のヒストグラムがターゲット ヒストグラム hgram にほぼ一致するように、グレースケール イメージ I を変換します。出力イメージのヒストグラム内のビン数は、length(hgram) と等しくなります。

newcmap = histeq(X,map) は、インデックス付きイメージ X のグレー成分のヒストグラムがほぼフラットになるように、カラーマップの値を変換します。変換されたカラーマップは newcmap です。

newcmap = histeq(X,map,hgram) は、インデックス付きイメージ (X,newcmap) のグレー成分のヒストグラムがターゲット ヒストグラム hgram にほぼ一致するように、インデックス付きイメージ X に関連付けられたカラーマップを変換します。関数 histeq は変換されたカラーマップを newcmap に返します。length(hgram)size(map,1) と同じでなければなりません。

[___,T] = histeq(___) は変換 T も返します。これは、入力グレースケール イメージまたはカラーマップのグレー成分を、出力グレースケール イメージまたはカラーマップのグレー成分にマッピングします。

すべて折りたたむ

イメージをワークスペースに読み取ります。

I = imread('tire.tif');

ヒストグラム均等化を使用して強度イメージのコントラストを強調します。

J = histeq(I);

元のイメージと調整されたイメージを表示します。

imshowpair(I,J,'montage')
axis off

Figure contains an axes object. The axes object contains an object of type image.

元のイメージのヒストグラムを表示します。

figure
imhist(I,64)

Figure contains 2 axes objects. Axes object 1 contains an object of type stem. Axes object 2 contains 2 objects of type image, line.

処理されたイメージのヒストグラムを表示します。

figure
imhist(J,64)

Figure contains 2 axes objects. Axes object 1 contains an object of type stem. Axes object 2 contains 2 objects of type image, line.

3 次元データセットを読み込みます。

load mristack

ヒストグラム均等化を行います。

enhanced = histeq(mristack);

元のイメージとコントラストが強調されたイメージのデータの 1 番目のスライスを表示します。

figure
subplot(1,2,1)
imshow(mristack(:,:,1))
title('Slice of Original Image')
subplot(1,2,2)
imshow(enhanced(:,:,1))
title('Slice of Enhanced Image')

Figure contains 2 axes objects. Axes object 1 with title Slice of Original Image contains an object of type image. Axes object 2 with title Slice of Enhanced Image contains an object of type image.

この例では、ヒストグラム均等化の変換曲線をプロットする方法を説明します。関数 histeq は、可能な各入力値に対応する結果の出力値を示す 1 行 256 列のベクトルを出力します (このベクトルの値は、入力イメージのクラスに関係なく、[0,1] の範囲に入ります)。このデータをプロットして、変換曲線を表示できます。

イメージをワークスペースに読み取ります。

I = imread('pout.tif');

ヒストグラム均等化の関数 histeq を使用してコントラストを調整します。グレースケール変換の戻り値 T を指定します。これは強度イメージ I のグレー レベルから J のグレー レベルへのマッピングを示すベクトルです。

[J,T] = histeq(I);

変換曲線をプロットします。このグラフは、前の図の中のヒストグラムを反映していることに注意してください。つまり、入力値のほとんどが 0.3 と 0.6 の間にあるのに対し、出力値は 0 と 1 の間に均等に分布しています。

figure
plot((0:255)/255,T);

Figure contains an axes object. The axes object contains an object of type line.

入力引数

すべて折りたたむ

グレースケール イメージ。任意の次元の数値配列として指定します。

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

ターゲット ヒストグラム。数値ベクトルとして指定します。ターゲット ヒストグラムには、適切な範囲にわたる強度値のビンが等間隔に分布していなければなりません。強度値の範囲は、入力イメージのデータ型によって異なります。

  • single または double — [0, 1]。

  • uint8 — [0, 255]。

  • uint16 — [0, 65535]。

  • int16 — [–32768, 32767]。

既定では、ターゲット ヒストグラム内のビン数は length(hgram) と等しくなります。

次に例を示します。

hgram = 256:-4:4;
J = histeq(I,hgram);
64 個のビンから成るターゲット ヒストグラムを、平坦でない線形減少関数として指定します。これは、小さいピクセル値を強調します。

histeq は、sum(hgram) == numel(I) となるように hgram を自動的にスケーリングします。length(hgram)I の離散レベル数よりもはるかに小さいと、ヒストグラム Jhgram にさらに一致するようになります。

データ型: single | double

離散グレー レベルの数。正の整数として指定します。

データ型: single | double

インデックス付きイメージ。任意の次元の数値配列として指定します。X の値はカラーマップ map のインデックスです。

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

インデックス付きイメージ X に関連付けられたカラーマップ。範囲 [0, 1] の値をもつ c 行 3 列の数値行列として指定します。各行は、カラーマップの単一色を構成する赤、緑、青の成分を指定する 3 要素の RGB 3 成分です。

データ型: double

出力引数

すべて折りたたむ

変換されたグレースケール イメージ。サイズとクラスが入力イメージ I と同じ数値配列として返されます。

グレースケール変換。数値ベクトルとして返されます。変換 T はイメージ I のグレー レベルを J のグレー レベルにマッピングします。

データ型: double

変換されたカラーマップ。範囲 [0, 1] の値をもつ n 行 3 列の数値行列として指定します。各行は、カラーマップの単一色を構成する赤、緑、青の成分を指定する 3 要素の RGB 3 成分です。

データ型: double

アルゴリズム

ターゲットのヒストグラム hgram を指定すると、histeq はグレースケール変換 T を選択して次を最小化します。

|c1(T(k))c0(k)|,

c0 は入力イメージ I の累積ヒストグラム、c1 はすべての強度 khgram の累積和です。この最小化には、次の制約があります。

  • T は単調でなければなりません

  • c1(T(a))a でのヒストグラム カウント間の距離の 1/2 を超えて c0(a) をオーバーシュートできません

histeq は変換 b = T(a) を使用して X (またはカラーマップ) 内のグレー レベルをその新しい値にマッピングします。

hgram を指定しない場合、histeq はフラットな hgram を作成します。

hgram = ones(1,n)*prod(size(A))/n;

次に、前のアルゴリズムを適用します。

拡張機能

バージョン履歴

R2006a より前に導入

すべて展開する