Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

decorrstretch

無相関ストレッチをマルチチャネル イメージに適用

説明

S = decorrstretch(A) は、無相関ストレッチを RGB イメージまたはマルチスペクトル イメージ A に適用し、結果を S に返します。S の各帯域の平均と分散は A の場合と同じになります。

無相関ストレッチの主な目的は視覚効果を高めることです。無相関ストレッチは、イメージにおける色差を強調するための手法です。

S = decorrstretch(A,Name,Value) は、名前と値のペアを使用して、各帯域のターゲット平均値や標準偏差などの無相関ストレッチの特性を制御します。

すべて折りたたむ

この例では、無相関ストレッチを使用して、色差を拡大させることにより、森のイメージ内の要素を強調表示する方法を説明します。

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

[X, map] = imread('forest.tif');

decorrstretch を使用して無相関ストレッチを適用します。

S = decorrstretch(ind2rgb(X,map),'tol',0.01);

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

figure
imshow(X,map)
title('Original Image')

Figure contains an axes. The axes with title Original Image contains an object of type image.

figure
imshow(S)
title('Enhanced Image')

Figure contains an axes. The axes with title Enhanced Image contains an object of type image.

入力引数

すべて折りたたむ

強調されるイメージ。m x n x nBands の RGB イメージまたはマルチスペクトル イメージとして指定します。RGB イメージの場合、nBands = 3 です。

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

名前と値のペアの引数

オプションの引数 Name,Value のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を、任意の順番で指定できます。

例: 'Mode','covariance'

無相関メソッド。'Mode' と以下の値で構成されるコンマ区切りのペアとして指定します。

  • 'correlation' — 帯域間の相関行列の固有値分解を使用します。

  • 'covariance' — 帯域間の共分散行列の固有値分解を使用します。

データ型: char | string

出力帯域のターゲット平均値。'TargetMean' と、長さ nBands の実数スカラーまたは実数ベクトルから構成されるコンマ区切りのペアとして指定します。既定では、TargetMean は各帯域の標本平均を含む 1 行 nBands 列のベクトルで、無相関ストレッチの前後で帯域の平均は維持されます。

TargetMeandouble クラスでなければなりませんが、入力イメージのピクセルと同じ値を使用します。たとえば、Auint8 クラスである場合には、127.5 が相応の値になります。入出力イメージ クラスの標準範囲に値を固定する必要がある場合は、結果に影響する可能性があります。

データ型: double

出力帯域のターゲット標準偏差値。'TargetSigma' と、長さ nBands の正のスカラーまたはベクトルから構成されるコンマ区切りのペアとして指定します。既定では、TargetSigma は各帯域の標本標準偏差を含む 1 行 nBands 列のベクトルで、無相関ストレッチの前後で帯域の分散は維持されます。ターゲット標準偏差は一様な (ゼロ分散) 帯域の場合は無視されます。

TargetSigmadouble クラスでなければなりませんが、入力イメージのピクセルと同じ値を使用します。たとえば、Auint8 クラスである場合には、50.0 が相応の値になります。

データ型: double

無相関ストレッチ後の線形コントラスト ストレッチ。'Tol' と、double クラスの数値スカラーまたは 2 要素の数値ベクトルから構成されるコンマ区切りのペアとして指定します。Tol の値を指定すると、TargetMean または TargetSigma の値がオーバーライドされます。Tol を指定しない場合、既定では decorrstretch は線形コントラスト ストレッチを実行しません。

Tolstretchlim での場合と同じ意味を持ちます。ここで、Tol = [LOW_FRACT HIGH_FRACT] は、低い強度と高い強度で飽和するイメージの割合を指定します。Tol をスカラー値として指定した場合、LOW_FRACT = Tol および HIGH_FRACT = 1 - Tol となり、低い強度と高い強度において同じ割合で飽和します。

Tol を少し調整しただけでも、出力の外観が大きく変わります。

データ型: double

帯域平均、共分散および相関の計算に使用される A のサブセット。ピクセルの添字の 2 つの配列 {rowsubs, colsubs} を含む cell 配列として指定します。rowsubs および colsubs は同じサイズのベクトルまたは行列で、それぞれ行と列の添字を含んでいます。

このオプションを使用して計算量を減らし、無効なピクセルや表現に関わらないピクセル (または、その両方) が変換に影響を及ぼさないようにします。たとえば、rowsubscolsubs を使用して雲のかかった領域を除外することができます。指定しない場合、decorrstretch は、A 内のすべてのピクセルを使用します。

データ型: double

出力引数

すべて折りたたむ

無相関ストレッチが行われたイメージ。入力イメージ A と同じサイズとクラスの数値配列として返されます。

ヒント

  • (コントラスト ストレッチオプションを使用しない) 直線無相関の結果には、uint8 クラスまたは uint16 クラスでサポートされている数値範囲外の値 (負の値、あるいは 255 または 65535 をそれぞれ超える値) が含まれることがあります。そのような場合、decorrstretch はサポートされている範囲に出力を固定します。

  • double クラスについては、線形コントラスト ストレッチを指定してから区間 [0 1] に固定する Tol の値を与えた場合にのみ、decorrstretch は出力を固定します。

  • オプションのパラメーターは相互に影響しません。ただし、線形ストレッチでは通常、帯域の平均と帯域の標準偏差の両方が変更されます。したがって、TargetMean および TargetSigmaTol と共に指定はできますが、それらの効果は修正されます。

アルゴリズム

無相関ストレッチは、特定のパラメーターが実際のイメージの統計と目的の (ターゲット) イメージ統計の値によって決まる、ピクセル単位の線形処理です。入力イメージ A の各帯域において、与えられたピクセルの値を含むベクトル a は、次のように、出力イメージ B の対応するピクセル b に変換されます。

b = T * (a - m) + m_target.

a および bnBands 行 1 列のベクトル、TnBandsnBands 列の行列、m および m_targetnBands 行 1 列のベクトルであり、以下のようになります。

  • m には、イメージ内、または指定したイメージ ピクセルのサブセット内の各帯域の平均が含まれます。

  • m_target には、各帯域で望まれる出力の平均が含まれます。既定の選択は m_target = m です。

線形変換行列 T は、以下によって決まります。

  • 行列 Cov で表される、イメージの帯域間のサンプル共分散、または指定したイメージのサブセット (m に使用されるのと同じサブセット) の帯域間のサンプル共分散。

  • 各帯域で望まれる出力標準偏差。これは便宜上、対角行列 SIGMA_target で表されます。既定の選択は SIGMA_target = SIGMA です。ここで、SIGMA は各帯域の標本標準偏差を含む対角行列です。SIGMA は、m および Cov に使用されたものと同じサンプル ピクセルから、次のように計算されます。

    SIGMA(k,k) = sqrt(Cov(k,k), k = 1,..., nBands).

CovSIGMA および SIGMA_target は、以下で定義される行列 CorrLAMBDA および V と同様、nBandsnBands 列です。

T を計算するには、まず共分散行列 Cov または次の相関行列のいずれかの固有値分解を実行します。

Corr = inv(SIGMA) * Cov * inv(SIGMA).

  • 相関に基づくメソッドの場合、Corr は次のように分解されます。Corr = V LAMBDA V'

  • 共分散に基づくメソッドの場合、Cov は次のように分解されます。Cov = V LAMBDA V'

LAMBDA は固有値の対角行列であり、VCorrCov のいずれかを LAMBDA に変換する直交行列です。

次の手順は、各帯域のストレッチ係数の計算です。これは、対応する固有値の逆平方根です。次のように、ストレッチ係数を含む対角行列 S を定義すると便利です。

S(k,k) = 1 / sqrt(LAMBDA(k,k)).

最後に、行列 T が以下のいずれかによって計算されます。

T = SIGMA_target V S V' inv(SIGMA) (相関に基づくメソッド)

または

T = SIGMA_target V S V' (共分散に基づくメソッド)

帯域分散が一様である場合、2 つのメソッドで同じ結果が導き出されます。

T を、以下のように、b の式に代入します。

b = m_target + SIGMA_target V S V' inv(SIGMA) * (a - m)

または

b = m_target + SIGMA_target V S V' * (a - m)

右から順に式を見ていくと、無相関ストレッチによって以下の処理が行われることがわかります。

  1. 各帯域から平均を削除する

  2. 各帯域をその標準偏差によって正規化する (相関に基づくメソッドの場合のみ)

  3. 帯域を Corr または Cov の固有空間へと回転させる

  4. イメージを固有空間で無相関化および正規化されたままにして、ストレッチ S を固有空間で適用する

  5. 回転して元の帯域空間に戻す。ただし、帯域は無相関化および正規化されたままになっている

  6. SIGMA_target に従って各帯域を再スケールする

  7. 平均を各帯域に戻す

R2006a より前に導入