Main Content

pcmedian

3 次元点群データのメディアン フィルター処理

R2020b 以降

説明

ptCloudOut = pcmedian(ptCloudIn) は、3 次元点群データのメディアン フィルター処理を実行します。この関数は点群の各チャネルを個別にフィルター処理します。出力はフィルター処理された点群です。それぞれの出力位置プロパティ値は、対応する入力位置プロパティ値の近傍の中央値です。関数 pcmedian はエッジをゼロでパディングしません。代わりに、使用可能な近傍の値のみについて演算を行います。

入力点群がオーガナイズド点群の場合、関数 pcmedian は N 行 N 列の近傍法を使用します。点群がアンオーガナイズドの場合、関数は半径近傍法を使用します。

ptCloudOut = pcmedian(___,Name,Value) は、1 つ以上の名前と値のペアの引数を使用してオプションを指定します。たとえば、'FilterSize',3 は、オーガナイズド点群のメディアン フィルターのサイズを 3 に設定します。

すべて折りたたむ

メディアン フィルターを使用して点群からノイズを除去します。最初に、点群にランダム ノイズを追加します。その後、関数 pcmedian を使用してノイズをフィルター処理します。

点群を作成します。

gv = 0:0.01:1;
[X,Y] = meshgrid(gv,gv);
Z = X.^2 + Y.^2;
ptCloud = pointCloud(cat(3,X,Y,Z));

"z" 軸に沿ってランダム ノイズを追加します。

temp = ptCloud.Location;
count = numel(temp(:,:,3));
temp((2*count) + randperm(count,100)) = rand(1,100);
temp(count + randperm(count,100)) = rand(1,100);
temp(randperm(count,100)) = rand(1,100);
ptCloudA = pointCloud(temp);

メディアン フィルターを適用し、3 つの点群 (元の点群、ノイズを含む点群、フィルター処理後の点群) を表示します。

ptCloudB = pcmedian(ptCloudA);

subplot(1,3,1)
pcshow(ptCloud)
title('Original Data')
subplot(1,3,2)
pcshow(ptCloudA)
title('Noisy Data')
subplot(1,3,3)
pcshow(ptCloudB)
title('Filtered Data')

Figure contains 3 axes objects. Axes object 1 with title Original Data contains an object of type scatter. Axes object 2 with title Noisy Data contains an object of type scatter. Axes object 3 with title Filtered Data contains an object of type scatter.

点群データをワークスペースに読み込みます。

ptCloud = pcread('highwayScene.pcd');
roi = [0 20 0 20 -5 15];
indices = findPointsInROI(ptCloud,roi);
ptCloud = select(ptCloud,indices);
ptCloud = pcdownsample(ptCloud,'gridAverage',0.2);

点群データを表示します。各点はそれぞれの x 座標に基づいて色分けされます。

figure
pcshow(ptCloud.Location,ptCloud.Location(:,1))
view(-90,2)
title('Original Point Cloud')

Figure contains an axes object. The axes object with title Original Point Cloud contains an object of type scatter.

z チャネルに沿って区間 (a,b) にノイズを追加します。ab の値については、ノイズが地面の近くに現れるような値を選択します。

temp = ptCloud.Location;
count = numel(temp(:,3));
a = -2.5;
b = -2;
temp((2*count)+randperm(count,200)) = a+(b-a).*rand(1,200);
ptCloudA = pointCloud(temp);

ノイズを含む点群を表示します。各点はそれぞれの x 座標に基づいて色分けされます。

figure
pcshow(ptCloudA.Location,ptCloudA.Location(:,1))
view(-90,2)
title('Noisy Point Cloud')

Figure contains an axes object. The axes object with title Noisy Point Cloud contains an object of type scatter.

点群にメディアン フィルターを適用します。

ptCloudB = pcmedian(ptCloudA,'Dimensions',3,'Radius',1);

フィルター処理後の点群を表示します。各点はそれぞれの x 座標に基づいて色分けされます。

figure
pcshow(ptCloudB.Location, ptCloudB.Location(:,1))
view(-90,2)
title('Filtered Point Cloud')

Figure contains an axes object. The axes object with title Filtered Point Cloud contains an object of type scatter.

入力引数

すべて折りたたむ

点群。少なくとも 1 つの有効な点を含む pointCloud オブジェクトとして指定します。入力点群がオーガナイズドの場合、点群のサイズは少なくとも 3×3×3 でなければなりません。

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後に表示されなければなりませんが、ペアの順序は重要ではありません。

R2021a より前は、名前と値をそれぞれコンマを使って区切り、Name引用符で囲みます。

例: 'FilterSize',3 は、メディアン フィルターのサイズを 3 と指定します。

対象の点群の次元。範囲 [1 3] の整数のベクトルとして指定します。値 1、2、3 は x 軸、y 軸、z 軸にそれぞれ対応します。次元は昇順で指定しなければなりません。

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

オーガナイズド点群のメディアン フィルターのサイズ。範囲 [3, N] の奇数の整数として指定します。N は点群の最も小さいチャネル次元です。

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

アンオーガナイズド点群の近傍の半径。正のスカラーとして指定します。指定した半径の内側にある点が多いと計算時間が増えます。そのため、密な点群に対して半径の値を大きくすると、計算時間が長くなり、パフォーマンスに影響する可能性があります。

データ型: single | double

出力引数

すべて折りたたむ

フィルター処理された点群。pointCloud オブジェクトとして返されます。

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

バージョン履歴

R2020b で導入

参考

関数

オブジェクト