。
24ビットカラー表示のシステムで,トゥルーカラーイメージは最大16777216色(すなわち224.)まで表示可能です。しかし,より低いスクリーンビット深度をもつシステム上で,トゥルーカラーイメージは,非常にうまく表示できます。これは,必要に応じて,MATLAB®が自动的に色近似とディザリングを行うからです。色近似は,正确に一致する色が见つからない场合に,ソフトウェアが代わりの色を选択する处理です。
しかし,インデックス付きイメージは,多くの色数をもっている場合に問題が起こる可能性があります。一般に,次の理由で,インデックス付きイメージを256色までに制限すべきです。
8ビット表示をもつシステムで,256色を超えるカラーのインデックス付きイメージは,ディザリングまたはマッピングしなければなりません。そのため,うまく表示できません。
一部のプラットフォームでは,カラーマップに256を超えるエントリを登录できません。
インデックス付きイメージが256色を超える場合,MATLABはuint8.
配列にイメージデータをストアすることはできません。しかし,一般には,代わりに,双倍的
クラスの配列を使い,イメージのストレージサイズをより大きくします(各ピクセルは64ビットを使用)。
多くの画像ファイル形式は,インデックス付きイメージを256色に制限しています0.256色を超える色数を使用するインデックス付きイメージを(IMWRITE.
を使用して)256色までしかサポートしない形式に书き込むと,エラーが発生します。
イメージの色数を削減する方法には以下があります。
イメージの色数を削减するには,关数rgb2ind
を使用します。この关数は,トゥルーカラーイメージをインデックス付きイメージに変换し,この处理で色数を削减します。rgb2ind
では,元のイメージでの色を近似するために次の方法が提供されます。
量子化 (量子化を参照)
一様量子化
最小分散量子化
カラーマップのマッピング(カラーマップのマッピングを参照)
结果のイメージの画质は,使用する近似法,入力イメージの色の范囲,およびディザリングの使用の有无に依存します。どの方法がより有效に机能するかはイメージによって异なります。ディザリングとそれを有效または无效にする方法の详细については,ディザリングを使用した色数の削减を参照してください。
イメージ内の色数を削减するには, “量子化”を行います。关节rgb2ind
は,色数低减アルゴリズムの一部として量子化を使用します。rgb2ind
は,一様量子化と最小分散量子化の2つの量子化法をサポートします。
イメージの量子化の说明で重要な用语は,”RGB.カラーキューブ”です.RGBカラーキューブは,特别なデータ型に対して,定义されるカラー全体を表す3次元配列です.MATLABの中でRGBイメージは,uint8.
那uint16
那双倍的
のいずれかのタイプで,これらに対して3種類の異なるタイプのカラーキューブの定義があります。たとえば,RGBイメージがuint8.
クラスの场合,256个の値は,各色平面(赤,绿,青)に対して定义され,全体として,224.(16777216)の色がカラーキューブで定义されます。このカラーチューブは,実际に使用する色にかかわらず,uint8.
RGBイメージ全体に対して,同じものになります。
uint8.
那uint16
那双倍的
の3つのカラーキューブは,同じ色範囲をもっています。言い換えれば,uint8.
RGBイメージの中の明るい赤は,双倍的
RGBイメージの中の明るい赤と同じように表示されます。违いは,双倍的
RGBカラーキューブは,より多くの赤の阶调(すべての色で多くの阶调)をもっていることです。次の図は,uint8.
イメージ用のRGBカラーキューブを示しています。
uint8イメージ用のRGBカラーキューブ
量子化は,RGBカラーキューブをより小さな数のボックスに分け,その後,すべてのカラーを,対応するボックスの中心のカラー値にマッピングする处理です。
一様量子化と最小分散量子化は,RGBカラーキューブを分けるために使用するアプローチに违いがあります。一様量子化では,カラーキューブは,同じサイズのボックス(より小さいキューブ)に切り取られます。最小分散量子化では,种々の异なるサイズのボックス(必ずしも,キューブではない)に切り取られます。ボックスのサイズは,イメージの中に分布する色数に依存します。
一様量子化-一様量子化を実行するには,関数rgb2ind
を呼び出し,许容误差を指定します。许容误差は,RGBカラーキューブを分配する立方体のサイズを决定します。许容误差の设定値は,[0,1]の范囲の値です。たとえば,许容误差を0.1
とすると,ボックスのエッジは,RGBカラーキューブの长さの1/10になり,ボックスの最大数は,次のようになります。
n =(地板(1 / tol) + 1) ^ 3
次のコマンドは,许容误差0.1を设定した一様量子化を行います。
RGB = imread (“peppers.png”);[x,map] = rgb2ind(RGB, 0.1);
次の図は,uint8.
イメージの一様量子化を示します。この図は,わかりやすくするためにカラーキューブの2次元スライス(または,色平面)を示しており,红色= 0,绿色と蓝色が0から255までの範囲に相当します。実際のピクセル値はxの中心で示されています。
RGBカラーキューブのスライス上での一様量子化
カラーキューブを分割した後,すべての空のボックスを切り捨てます。そのため,ボックスの中の1つのみを使用して,カラーマップ用の1つの色を作ります。前に示したように,一様量子化で作成されるカラーマップの最大長は予測できますが,rgb2ind
は入力イメージの中に现れない色を除去するので,カラーマップは予测したものより短くなります。
最小分散量子化-最小分散量子化を実行するには,rgb2ind
を呼び出し,出力イメージのカラーマップの中にある色の最大数を指定します。指定した値によって,RGBカラーキューブが分割されるボックスの数が决定します。次のコマンドは,185カラーをもつインデックス付きイメージを最小分散量子化を使用して作成します。
RGB = imread (“peppers.png”);[X,地图]= rgb2ind (RGB, 185);
最小分散量子化は,ピクセル値間の分散に基づいてピクセルをグループに関連付けることによって行われます。たとえば,青のピクセルの集合は,グループの中心ピクセルからわずかしかズレていないの,ですべて同じグループになります。
最小分散量子化で,カラーキューブを分配するボックスのサイズは异なり,カラーキューブを必ずしも満たすものではありません。カラーキューブのある部分で,ピクセルが存在しない场合,これらの部分にはボックスは存在しません。
rgb2ind
を使用するときに,ボックス数N
を設定すると,配置はイメージのカラーデータを解析するときのアルゴリズムにより決定されます。イメージが,最適に配置されたN
个のボックスに分割されると,各ボックスの中のピクセルは,一様量子化と同様にボックスの中心のピクセル値にマッピングされます。
結果のカラーマップは,ユーザーが指定したエントリ数をもっています。これは,各領域は,入力イメージの中で少なくとも1つの色を含むようにカラーキューブが分割されるためです。入力イメージで使用される色が指定した数より少ない場合,出力カラーマップの色数はN
より少なくなり,出力イメージは入力イメージの色のすべてを含んでいます。
次の図は,前の図(一様量子化)で使用されているカラーキューブと同じ2次元スライスを示しています。11個のボックスが,最小分散量子化を使用して作成されます。
RGBカラーキューブのスライス上での最小分散量子化
色数を与えると,最小分散量子化は,実际のデータを考虑するので一様量子化よりも良い结果を出力します。最小分散量子化は,入力イメージに频繁に现れる色には,より多くのカラーマップエントリを割り当てます。あまり频繁に现れないものは,カラーマップ要素の割り当てが少なくなります。结果として,色の精度は一様量子化よりも高くなります。たとえば,入力イメージには,绿の阶调が多く,赤の阶调が少ないとすると,出力のカラーマップには,赤よりも绿が増えます。最小分散量子化に必要な计算时间は一様量子化の场合よりも増えます。
使用する実際のカラーマップを指定する場合,rgb2ind
は,(量子化の代わりに) “カラーマップマッピング”を使用して,指定したカラーマップの中で,RGBイメージの中の色と最適に一致する色を探します。この方法は,固定したカラーマップを使用してイメージを作成する場合に役立ちます。たとえば8ビット表示上で複数のインデックス付きイメージを表示する場合,同じカラーマップにこれらすべてをマッピングすることにより,色に関する問題を避けることができます。カラーマップマッピングは,指定したカラーマップが,RGBイメージの中の色と同じ色を使う場合に良い近似になります。カラーマップが,RGBイメージのものと異なる場合,この方法による結果は良いものではありません。
この例は2つのイメージを同じカラーマップにマッピングしたものを示しています。2つのイメージに対して使用されるカラーマップは,指定の色数を含むRGBカラーマップを作成するMATLAB関数colorcube
を使用して実行中に作成されます(colorcube
は与えられた色数に対して,常に同じカラーマップを作成します)。カラーマップは,RGBカラーキューブに含まれるすべての色を含んでいるので,出力イメージは,入力イメージの良い近似になります。
RGB1 = imread(“autumn.tif”);RGB2 = imread(“peppers.png”);X1 = rgb2ind(RGB1,colorcube(128));X2 = rgb2ind(RGB2,colorcube(128));
メモ:
关节imshow.
は,复数のインデックス付きイメージを表现するために有效なものです。详细については,同じ图ウィンドウ内に个别にイメージを表示または関数imshow.
のリファレンスページを参照してください。
インデックス付きイメージで色数を削减しなければならない场合は,imapprox
を使用します。imapprox
はrgb2ind
に基づいて处理され,同じ近似法を使用します。本质的に,imapprox
は,最初にind2rgb
を呼び出して,イメージをRGB形式に変换し,次にrgb2ind
を呼び出して,色数を減らした新しいインデックス付きイメージを戻します。
たとえば,元のイメージは128色ですが,次のコマンドを使用して,64色の树木
イメージを作成します。
加载树木[Y,newmap] = imapprox(X,地图,64);imshow(Y,newmap)
结果のイメージの画质は,使用する近似法,入力イメージの色の范囲,およびディザリングの使用の有无に依存します。どの方法がより有效に机能するかはイメージによって异なります。ディザリングとそれを有效または无效にする方法の详细については,ディザリングを使用した色数の削减を参照してください。
イメージの色数を减らすためにrgb2ind
またはimapprox
を使うと,一部の色が失われるために,最终的なイメージは元のイメージより劣化して见える可能性があります。rgb2ind
とimapprox
はどちらも “ディザリング” を行って出力イメージの见かけの色の数を増やします。“ディザリング”は,ある近傍の中でピクセルの色数を変化させ,各ピクセルの周りの平均色が元のRGBカラーを近似するものです。
ディザリングがどのように機能するかの例として,カラーマップに厳密な意味で一致しない,暗いオレンジのピクセルを含むイメージを考えます。オレンジのこの階調を作成するために,ディザリングはカラーマップから色の組み合わせを選択し,6個のピクセルをひとまとめにして,希望するオレンジの階調に近似します。遠目には,ピクセルは正しい階調で見えますが,近くでイメージを見ると,他の階調が混ざっているように見えます。ディザリングを説明するために,次の例では24ビットのトゥルーカラーイメージを読み取り,rgb2ind
を使用してわずか8色だけでインデックス付きイメージを作成します。最初の例はディザリングが使用されていません。2番目の例はディザリングが使用されています。
イメージを読み取り,それを表示します。
RGB = imread('onion.png');imshow(RGB)
インデックス付きイメージを8色で,ディザリングなしで作成します。
[X_no_dither,地图] = rgb2ind(RGB,8,“nodither”);imshow(X_no_dither,地图)
ディザリングで,8色のインデックス付きイメージを作成します。ディザリングされたイメージは,见かけの色の数を非常に大きくしますが,若干あいまいに见えることに注意してください。ディザリングされていないイメージは,见かけの色数が少なく见えますが,ディザリングされたイメージと比べ,空间分解能が高くなっています。ディザリングなしで色数を减らすことによるリスクの1つに,新しいイメージに伪の等高线を生じる可能性があります。
[X_dither,地图] = rgb2ind(RGB,8,“抖动”);imshow(X_dither,地图)