三次元表示を行いたい​(三次元空間内でメダ​カを棒状で表示したい​)のですが、あともう​少しのアイデアが出ま​せん。教えていただけ​ないでしょうか?

3 次查看(过去 30 天)
Takuya Nagai
Takuya Nagai 2018-1-31
回答: Jiro Doke 2018-2-2
3次元表示なので、2方向から撮影した画像を画像処理により、対象物である メダカの重心座標・楕円長軸・楕円短軸などは求まりました。 プログラムは以下の通りです。
clear all;
BW = imread('nuri x.jpg');
BW2=rgb2gray(BW)>0;
%%regionprops を使用してイメージ内の連結要素の重心を計算します。
s = regionprops(BW2,'centroid');
%%各重心位置計算されたエリアの面積
Areas = regionprops(BW2,'Area');
%%角度計算
d=regionprops(BW2,'Orientation');
%%楕円長軸計算
l=regionprops(BW2,'MajorAxisLength');
%%楕円短軸計算
m=regionprops(BW2,'MinorAxisLength');
%%重心を格納する構造体配列を単一の行列に連結します。
centroids = cat(1, s.Centroid);
centroids2 = cat(1, Areas.Area);
centroids(:,3) = centroids2;
length(centroids)
format long
disp(centroids)
j=1;
for i=1:length(centroids)
if (centroids(i,3)>1000 && centroids(i,3)<10000)
medaka_index = i;
end
end
%%重心の位置を重ね合わせたバイナリ イメージを表示します。
imshow(BW)
hold on
plot(centroids(medaka_index,1),centroids(medaka_index,2), 'b*')
hold off
この結果を用いることで、3次元空間でメダカを棒状で表示できるのではないかと思うのですが、そのやりかたが分かりません。どうかお助けください。

采纳的回答

Kei Otsuka
Kei Otsuka 2018-2-1
3次元のpatchオブジェクトを使って棒状表示してみては如何でしょうか。 こちらの ヘルプドキュメントが参考になるのではと思います。
%メダカの位置やサイズを指定
r1 = [50,50,10]; %基準位置(x,y,z)
l1 = [15, 5, 5]; %サイズ(x,y,z)
 
%頂点&面作成用基準行列
vert = [0,0,0; 1,0,0; 0,1,0; 0,0,1; 1,1,0; 0,1,1; 1,0,1; 1,1,1];
fac = [1,2,5,3; 1,3,6,4; 1,4,7,2; 4,7,8,6; 2,5,8,7; 3,6,8,5];
 
%メダカ1オブジェクトの頂点を決定
vert1 = repmat(l1, [8 1]) .* vert + repmat(r1, [8 1]);
 
%メダカ1用patchオブジェクト作成
patch('Faces',fac,'Vertices',vert1,'FaceColor','y');
 
%座標軸の範囲や縦横比設定など
axis vis3d equal;
view([-30,30]);
camlight;
grid on;
xlim([0,255]);
ylim([0,255]);
zlim([0,100]);
上記コマンドを実行すると以下のような3次元のプロットが得られます。
2匹目のメダカを追加したい場合は、以下のような記述を追加します。
r2 = [200,200,20]; %メダカ2の基準位置
l2 = [20, 7, 7]; %メダカ2のサイズ
 
%メダカ2オブジェクトの頂点を決定
vert2 = repmat(l2, [8 1]) .* vert + repmat(r2, [8 1]);
  
%メダカ2用patchオブジェクト作成
patch('Faces',fac,'Vertices',vert2,'FaceColor','g');
2匹目は少し大きいサイズにしてみました。
  1 个评论
Takuya Nagai
Takuya Nagai 2018-2-2
アドバイスありがとうございます!

请先登录,再进行评论。

更多回答(1 个)

Jiro Doke
Jiro Doke 2018-2-2
ellipsoid 関数を使ってもできそうです。
% 中心点(xc, yc, zc)、半軸の長さ(xr, yr, zy)、解像度(n)
[x,y,z] = ellipsoid(200,200,20,10,4,4,100);
surface(x,y,z,'EdgeColor','none','FaceColor','r')
% 中心点(xc, yc, zc)、半軸の長さ(xr, yr, zy)、解像度(n)
[x,y,z] = ellipsoid(50,50,10,20,4,4,100);
surface(x,y,z,'EdgeColor','none','FaceColor','b')
%座標軸の範囲や縦横比設定など
axis vis3d equal;
view([-30,30]);
camlight;
grid on;
xlim([0,255]);
ylim([0,255]);
zlim([0,100]);

类别

Help CenterFile Exchange 中查找有关 3 次元ボリューム イメージの処理 的更多信息

Community Treasure Hunt

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

Start Hunting!