座標から三次元再構築するには

現在、txtファイルとしてn行4列のファイルがあります。
1列目からx、y、zの座標になっており、4列目は2値化した輝度値になります。
このファイルを読み込んで、3次元的に図形を確認したいです。最終的には、3点を抽出してその3点を通るような断面を確認したいです。
その一歩として、まずはMATLABで形を確認したいです。
どうか知恵をお貸しいただけないでしょうか。よろしくお願いします。

 Accepted Answer

1 vote

まず、Logのコピー.txtのデータ読み取りと、3次元の図形での確認方法の例を示します。
すみませんが、4列目の2値化した輝度値というのがよく分からなかったので、とりあえず4列目はグレースケール化して表示しました。
logData = readmatrix('Logのコピー.txt');
cData = repmat(logData(:,4) ./ 255, 1, 3); % 255:白 0:黒
s = scatter3(logData(:,1), logData(:,2), logData(:,3), 'CData', cData, 'Marker', '.', 'MarkerEdgeColor', 'flat');
次に3点を通る断面の確認ですが、少々実装が面倒でしたので、参考までに簡略化して、x座標が200の面の断面を表示(x座標が200未満点群を非表示)する例を示します。
isOver200X = logData(:,1) >= 200;
s.MarkerFaceAlpha = 'flat';
s.AlphaData = double(isOver200X);% X座標が200未満の点群を透明化

4 Comments

Atsushi Ueno
Atsushi Ueno on 8 Nov 2022
内臓か何かを3Dスキャンした点群データでしょうか。マウスでグリグリすると大体の形は見えます。
上記の例題を全く無加工で動かして断面図を得る事が出来ました。もう寝る。
t = readmatrix("Logのコピー.txt");
scatter3(t(:,1),t(:,2),t(:,3),1,t(:,3)); % Z軸方向に色付けしてみる
%t(:,4) = t(:,4) - min(t(:,4));
%t(:,4) = t(:,4) ./ max(t(:,4));
%scatter3(t(:,1),t(:,2),t(:,3),1,[t(:,4) t(:,4) t(:,4)]);
% 色を0-1に正規化してモノクロで表示しようとした⇒いまいち見えにくい
ptCloud = pointCloud(t(:,1:3)); % 点群データにする
% pcshow(ptCloud);
maxDistance = 0.02;
referenceVector = [0,0,1];
maxAngularDistance = 5;
[model1,inlierIndices,outlierIndices] = pcfitplane(ptCloud,...
maxDistance,referenceVector,maxAngularDistance);
plane1 = select(ptCloud,inlierIndices);
remainPtCloud = select(ptCloud,outlierIndices);
roi = [-inf,inf;0.4,inf;-inf,inf];
sampleIndices = findPointsInROI(remainPtCloud,roi);
[model2,inlierIndices,outlierIndices] = pcfitplane(remainPtCloud,...
maxDistance,SampleIndices=sampleIndices);
plane2 = select(remainPtCloud,inlierIndices);
remainPtCloud = select(remainPtCloud,outlierIndices);
figure
pcshow(plane1) % 断面が見える。厚みのある内臓か何かの様に見える
title("First Plane")
figure
pcshow(plane2) % 断面が見える。厚みのある内臓か何かの様に見える
title("Second Plane")
figure
pcshow(remainPtCloud) % これもZ軸方向に色付けされるが何となく見やすい
title("Remaining Point Cloud")
雄大
雄大 on 10 Nov 2022
ありがとうございます。
色付けに関しては、色付けしない場合には”scatter3...”の行を変更すれば良いのでしょうか。
この断面を任意に決定することはどうしても難しいでしょうか。
Atsushi Ueno
Atsushi Ueno on 10 Nov 2022
> 色付けしない場合には”scatter3...”の行を変更すれば良いのでしょうか ⇒ はいそうです。
@交感神経優位なあかべぇさんの下記コードは、2値化した輝度値(元の範囲は0-255と思われる)を正規化し、同じデータを3列並べRGB成分(でのグレースケール色)として色指定しています。
cData = repmat(logData(:,4) ./ 255, 1, 3); % 255:白 0:黒
3列ではなく1列だと、カラーマップを参照します。カラーマップを"gray"に変更すれば1列の成分で色指定することができます。
colormap(gca,"gray")
> この断面を任意に決定することはどうしても難しいでしょうか。
App Designerなどを使用して、任意の断面を選択して出力できるアプリなどを作成してみてはいかがでしょうか?

Sign in to comment.

More Answers (0)

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!