Main Content

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

multithresh

Otsu 法を使用する複数レベルのイメージしきい値

説明

thresh = multithresh(A) は Otsu 法を使用してイメージ A に対して計算された 1 つのしきい値 thresh を返します。threshimquantize の入力引数として使用すると、イメージを 2 レベルのイメージに変換できます。

thresh = multithresh(A,N) は Otsu 法を使用して、N 個のしきい値を含む 1 行 N 列のベクトル thresh を返します。threshimquantize の入力引数として使用すると、イメージ AN+1 個の離散レベルを持つイメージに変換できます。

[thresh,metric] = multithresh(___) は、計算されたしきい値の効果の尺度である metric を返します。

すべて折りたたむ

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

I = imread("coins.png");
imshow(I)

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

イメージのしきい値を 1 つ計算します。

level = multithresh(I);

関数 multithresh から返されたしきい値レベルを指定して関数 imquantize を使用し、イメージを 2 つの領域にセグメント化します。結果を表示します。

seg_I = imquantize(I,level);
imshow(seg_I,[])

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

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

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

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

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

thresh = multithresh(I,2);

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

labels = imquantize(I,thresh);

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

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

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

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

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

Figure contains an axes object. The axes object with title RGB Image contains an object of type 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")

Figure contains an axes object. The axes object with title Full RGB Image Quantization vs. Plane-by-Plane Quantization contains an object of type image.

結果を比較するには、各出力イメージにおける一意の 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

イメージを読み取ります。

I = imread('circlesBrightDark.png');

イメージ内の一意のグレースケール値をすべて検出します。

uniqLevels = unique(I(:));  

disp(['Number of unique levels = ' int2str( length(uniqLevels) )]);
Number of unique levels = 148

単調に増加する N の値に対する一連のしきい値を計算します。

Nvals = [1 2 4 8];
for i = 1:length(Nvals)
    [thresh, metric] = multithresh(I, Nvals(i) );
    disp(['N = ' int2str(Nvals(i)) '  |  metric = ' num2str(metric)]);
end
N = 1  |  metric = 0.54767
N = 2  |  metric = 0.98715
N = 4  |  metric = 0.99648
N = 8  |  metric = 0.99902

8 つの値からなる一連のしきい値を適用して imquantize で 9 レベルのセグメンテーションを行います。

seg_Neq8 = imquantize(I,thresh);
uniqLevels = unique( seg_Neq8(:) )
uniqLevels = 9×1

     1
     2
     3
     4
     5
     6
     7
     8
     9

seg_Neq8multithresh への入力として使用し、イメージのしきい値処理を行います。N は 8 (このセグメント化されたイメージのレベル数より 1 小さい値) に等しくなります。multithreshmetric 値の 1 を返します。

[thresh, metric] = multithresh(seg_Neq8,8)
thresh = 1×8

    1.8784    2.7882    3.6667    4.5451    5.4549    6.3333    7.2118    8.1216

metric = 1

今度は N の値を 1 増やしてもう一度イメージをしきい値処理します。この値はイメージのレベル数と等しくなっています。イメージのレベル数が要求されたしきい値の数に対して少なすぎたため、入力が退化していることに注意してください。そのため、multithresh は 0 の metric 値を返します。

[thresh, metric] = multithresh(seg_Neq8,9)
Warning: No solution exists because the number of unique levels in the image are too few to find 9 thresholds. Returning an arbitrarily chosen solution.
thresh = 1×9

     1     2     3     4     5     6     7     8     9

metric = 0

入力引数

すべて折りたたむ

しきい値処理されるイメージ。任意の次元の数値配列として指定します。multithresh は配列全体の集計ヒストグラムに基づいてしきい値を検出します。multithresh は RGB イメージを 3 次元の数値配列と見なし、3 つの色平面すべてを組み合わせたデータでしきい値を計算します。

multithresh は入力イメージ A の範囲 [min(A(:)) max(A(:))] を、以降の計算で使うヒストグラムを計算するための制限として使用します。multithresh は計算で NaNs を無視します。Infs-Infs は、ヒストグラムの最初のビンと最後のビンでそれぞれカウントされます。

A 内の一意の値の数が N 個以下である縮退した入力には、Otsu 法を使用した有効な解はありません。このような入力の場合、戻り値 thresh には A のすべての固有の値と、場合によって任意に選ばれたその他の値がいくつか含まれます。

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

しきい値の数。正の整数として指定します。N > 2 の場合、multithresh は Otsu 基準の探索ベースの最適化を使用してしきい値を検出します。探索ベースの最適化では、局所的な最適化結果のみが保証されます。局所的最適値に収束する確率は N に応じて増加するため、比較的小さい値の N (通常は N < 10) を使用するのが適切です。N の最大許容値は 20 です。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

出力引数

すべて折りたたむ

イメージを量子化するために使用される一連のしきい値。データ型がイメージ A と同じである 1 行 N 列の数値ベクトルとして返されます。

これらのしきい値は入力イメージ A と同じ範囲であり、範囲 [0, 1] に正規化したしきい値を返す関数 graythresh とは異なります。

しきい値の効果の尺度。範囲 [0, 1] の数値として返されます。高い値は、Otsu 法の客観的基準に基づいて入力イメージを N+1 個のクラスに分けるときに、しきい値の効果が大きいことを示します。A 内の異なる値の数が N 個以下である縮退した入力の場合、metric は 0 となります。

データ型: double

参照

[1] Otsu, N., "A Threshold Selection Method from Gray-Level Histograms," IEEE Transactions on Systems, Man, and Cybernetics, Vol. 9, No. 1, 1979, pp. 62-66.

拡張機能

バージョン履歴

R2012b で導入