Main Content

imquantize

指定された量子化レベルと出力値によるイメージの量子化

説明

quant_A = imquantize(A,levels) は、N 要素のベクトル levels に含まれる指定された量子化値を使用してイメージ A を量子化します。量子化されたイメージ quant_A のサイズは A と同じで、1 から N+1 の範囲にある N+1 個の離散整数値を含んでいます。この整数値は以下の条件で決まります。

  • A(k)levels(1) の場合は、quant_A(k) = 1

  • levels(m–1) < A(k)levels(m) の場合は、quant_A(k) = m

  • A(k) > levels(N) の場合は、quant_A(k) = N+1

quant_A = imquantize(A,levels,values) は、ピクセルに割り当てられる量子化値を指定します。

  • A(k)levels(1) の場合は、quant_A(k) = values(1)

  • levels(m–1) < A(k)levels(m) の場合は、quant_A(k) = values(m)

  • A(k) > levels(N) の場合は、quant_A(k) = values(N+1)

[quant_A,index] = imquantize(___) は以下の条件を満たす配列 index を返します。

quant_A = values(index)

すべて折りたたむ

イメージを読み取ってグレースケールに変換し、結果を表示します。

I = imread("foggysf2.jpg");
I = rgb2gray(I);
imshow(I)
title("Grayscale Image")

2 つのしきい値レベルを計算します。

thresh = multithresh(I,2);

関数 imquantize を使用して、イメージを 3 つのレベルにセグメント化します。

labels = imquantize(I,thresh);

関数 label2rgb を使用して、セグメント化したイメージをカラー イメージに変換し、イメージを表示します。

labelsRGB = label2rgb(labels);
imshow(labelsRGB)
title("Segmented Image")

RGB イメージを読み取って表示します。

I = imread("peppers.png");
imshow(I) 
title("RGB Image");

RGB イメージ全体から 7 つのレベルのしきい値を生成します。

threshRGB = multithresh(I,7);

RGB イメージの平面ごとにしきい値を生成します。

threshForPlanes = zeros(3,7);			

for i = 1:3
    threshForPlanes(i,:) = multithresh(I(:,:,i),7);
end

イメージ全体から計算された一連のしきい値を使用してイメージ全体を処理します。

value = [0 threshRGB(2:end) 255]; 
quantRGB = imquantize(I, threshRGB, value);

指定された平面から計算されたしきい値ベクトルを使用して各 RGB 平面を個別に処理します。各 RGB 平面で生成されたしきい値ベクトルを使用してその平面を量子化します。

quantPlane = zeros(size(I));

for i = 1:3
    value = [0 threshForPlanes(i,2:end) 255]; 
    quantPlane(:,:,i) = imquantize(I(:,:,i),threshForPlanes(i,:),value);
end

quantPlane = uint8(quantPlane);

ポスタリゼーションされた両方のイメージを表示して、2 つのしきい値処理スキームの視覚的な違いを確認してください。

montage({quantRGB,quantPlane}) 
title("Full RGB Image Quantization vs. Plane-by-Plane Quantization")

結果を比較するには、各出力イメージにおける一意の RGB ピクセル ベクトルの数を計算します。完全な RGB イメージ スキームよりも平面ごとのしきい値処理スキームのほうが、生成されている色が 23% 多くなっています。

dim = size(quantRGB);
quantRGBmx3 = reshape(quantRGB,prod(dim(1:2)),3);
quantPlanemx3 = reshape(quantPlane,prod(dim(1:2)),3);

colorsRGB = unique(quantRGBmx3,"rows");
disp("Unique colors in RGB image: "+length(colorsRGB));
Unique colors in RGB image: 188
colorsPlane = unique(quantPlanemx3,"rows");
disp("Unique colors in plane-by-plane image: "+length(colorsPlane));
Unique colors in plane-by-plane image: 231

イメージ内の離散レベルの数を 256 から 8 に減らします。この例では、2 つの異なる方法を使用して 8 つの出力レベルのそれぞれに値を割り当てます。

イメージを読み取り、それを表示します。

I = imread('coins.png');
imshow(I) 
axis off
title('Grayscale Image')

関数 multithresh から 7 つのしきい値を取得して、イメージを 8 つのレベルに分割します。

thresh = multithresh(I,7);

各量子化間隔の最大値が出力イメージの 8 つのレベルに代入されるように、valuesMax ベクトルを作成します。

valuesMax = [thresh max(I(:))]
valuesMax = 1x8 uint8 row vector

    65    88   119   149   169   189   215   255

[quant8_I_max, index] = imquantize(I,thresh,valuesMax);

同様に、各量子化間隔の最小値が出力イメージの 8 つのレベルに代入されるように、valuesMin ベクトルを作成します。ベクトル valuesMinimquantize をもう一度呼び出す代わりに、出力引数インデックスを使用して、これらの値を出力イメージに割り当てます。

valuesMin = [min(I(:)) thresh]
valuesMin = 1x8 uint8 row vector

    23    65    88   119   149   169   189   215

quant8_I_min = valuesMin(index);

両方の 8 レベルの出力イメージを並べて表示します。

imshowpair(quant8_I_min,quant8_I_max,'montage') 
title('Minimum Interval Value           Maximum Interval Value')

入力引数

すべて折りたたむ

入力イメージは、任意の次元の数値配列として指定します。

量子化レベル。長さ N の数値ベクトルとして指定します。離散量子化レベルの値は、単調増加の順序でなければなりません。

量子化値。長さ N+1 の数値ベクトルとして指定します。

出力引数

すべて折りたたむ

量子化後のイメージ。A と同じサイズの数値配列として返されます。入力引数 values が指定された場合、quant_A のデータ型は values と同じになります。それ以外の場合、quant_A のデータ型は double です。

マッピング配列。入力イメージ A と同じサイズの数値配列として返されます。この配列には、出力イメージを作成するために values にアクセスする整数インデックスが含まれており、quant_A = values(index) です。入力引数 values を指定しない場合、index = quant_A です。

データ型: double

拡張機能

GPU コード生成
GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。

バージョン履歴

R2012b で導入

すべて展開する