このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
multithresh
Otsu 法を使用する複数レベルのイメージしきい値
説明
は Otsu 法を使用してイメージ thresh
= multithresh(A
)A
に対して計算された 1 つのしきい値 thresh
を返します。thresh
を imquantize
の入力引数として使用すると、イメージを 2 レベルのイメージに変換できます。
は Otsu 法を使用して、thresh
= multithresh(A
,N
)N
個のしきい値を含む 1 行 N
列のベクトル thresh
を返します。thresh
を imquantize
の入力引数として使用すると、イメージ A
を N+1
個の離散レベルを持つイメージに変換できます。
例
イメージを 2 つの領域にセグメント化
イメージを読み取って表示します。
I = imread("coins.png");
imshow(I)
イメージのしきい値を 1 つ計算します。
level = multithresh(I);
関数 multithresh
から返されたしきい値レベルを指定して関数 imquantize
を使用し、イメージを 2 つの領域にセグメント化します。結果を表示します。
seg_I = imquantize(I,level); imshow(seg_I,[])
2 つのしきい値を使用したイメージの 3 レベル セグメント化
イメージを読み取ってグレースケールに変換し、結果を表示します。
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
metric 出力引数を使用した結果確認
イメージを読み取ります。
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_Neq8
を multithresh
への入力として使用し、イメージのしきい値処理を行います。N
は 8 (このセグメント化されたイメージのレベル数より 1 小さい値) に等しくなります。multithresh
は metric
値の 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
入力引数
A
— しきい値処理されるイメージ
数値配列
しきい値処理されるイメージ。任意の次元の数値配列として指定します。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
— しきい値の数
1
(既定値) | 正の整数
しきい値の数。正の整数として指定します。N > 2
の場合、multithresh
は Otsu 基準の探索ベースの最適化を使用してしきい値を検出します。探索ベースの最適化では、局所的な最適化結果のみが保証されます。局所的最適値に収束する確率は N
に応じて増加するため、比較的小さい値の N
(通常は N < 10
) を使用するのが適切です。N
の最大許容値は 20 です。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
出力引数
thresh
— 一連のしきい値
1 行 N
列の数値ベクトル
イメージを量子化するために使用される一連のしきい値。データ型がイメージ A
と同じである 1 行 N
列の数値ベクトルとして返されます。
これらのしきい値は入力イメージ A
と同じ範囲であり、範囲 [0, 1] に正規化したしきい値を返す関数 graythresh
とは異なります。
参照
[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.
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意および制限:
multithresh
では C コードの生成がサポートされています (MATLAB® Coder™ が必要)。汎用のMATLAB Host Computer
ターゲット プラットフォームを選択した場合、プリコンパイルされたプラットフォーム固有の共有ライブラリを使用するコードが、multithresh
によって生成されます。共有ライブラリを使用するとパフォーマンスの最適化は維持されますが、コードを生成できるターゲット プラットフォームが限定されます。詳細については、Image Processing Toolbox でサポートされているコード生成のタイプを参照してください。入力引数
N
はコンパイル時の定数でなければなりません。
GPU コード生成
GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。
使用上の注意および制限:
入力引数
N
はコンパイル時の定数でなければなりません。
バージョン履歴
R2012b で導入
参考
graythresh
| imquantize
| im2bw
| rgb2ind
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)