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

5 ビュー (過去 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 Center および File Exchange3 次元ボリューム イメージの処理 についてさらに検索

Community Treasure Hunt

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

Start Hunting!