Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

reducepoly

Ramer–Douglas–Peucker アルゴリズムを使用した ROI の点の密度の削減

説明

P_reduced = reducepoly(P) は、配列 P の点の密度を削減します。関数 reducepoly は、Ramer-Douglas-Peucker ライン簡略化アルゴリズムを使用して、直線に沿って点を削減し、遷移点 (ラインが曲がる点) のみを残します。

P_reduced = reducepoly(P,tolerance) は配列 P の点の密度を削減します。ここで、tolerance は直線から点がどの程度外れていても構わないかを指定します。

すべて折りたたむ

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

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

イメージをグレースケールからバイナリに変換します。

bw = imbinarize(I);

バイナリ イメージ内のすべてのコインの境界を取得します。

[B,L] = bwboundaries(bw,'noholes');

最初に検出されたコインの境界を選択します。

coinNumber = 1;
boundary = B{coinNumber};

最初に検出されたコインの境界を元のイメージ上にプロットします。

hold on
visboundaries({boundary})
xlim([min(boundary(:,2))-10 max(boundary(:,2))+10])
ylim([min(boundary(:,1))-10 max(boundary(:,1))+10])
hold off

reducepoly を使用して、コインの境界を定義する点の数を削減します。許容誤差を既定値の 0.001 よりも大きくすることで、点の数を少なくして返します。

tolerance = 0.02;
p_reduced = reducepoly(boundary,tolerance);

削減済みの多角形が元の多角形とどの程度適切に一致するかを確認するため、削減済みの多角形の頂点をイメージ上にプロットします。

line(p_reduced(:,2),p_reduced(:,1), ...
       'color','b','linestyle','-','linewidth',1.5,...
       'marker','o','markersize',5);
title('Original Polygon (Red) and Reduced Polygon (Blue)');

入力引数

すべて折りたたむ

削減される点。[x1 y1; ...; xn yn] 形式の n 行 2 列の数値行列として指定します。配列の各行は、ポリライン、多角形、またはフリーハンドなどの ROI 形状の頂点を定義します。

たとえば、関数 drawfreehand を使用して、フリーハンド ROI を描画できます。そして、フリーハンド ROI オブジェクトの Position プロパティから ROI の頂点を取得します。

roi = drawfreehand;
P = roi.Position;

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

削減アルゴリズムの感度。範囲 [0, 1] の数値スカラーとして指定します。許容誤差を増やすと、削減される点の数が増えます。許容誤差の値が 0 の場合、最小限の点が削減されます。許容誤差の値が 1 の場合、点の数が最大限に削減され、ラインの終点のみが残されます。

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

出力引数

すべて折りたたむ

削減されたデータセット。m 行 2 列の数値行列として返されます。削減された点の数は通常、P の元の点の数より少なくなります。

データ型: double

アルゴリズム

Ramer-Douglas-Peucker ライン簡略化アルゴリズムは、形状を再帰的に分割し、一連の点を直線に置き換えようと試みます。このアルゴリズムでは、一連のすべての点について、直線からの外れが tolerance で指定された値を越えていないことをチェックします。

R2019b で導入