MATLAB Answers

0

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

Asked by Takuya Nagai on 31 Jan 2018 at 18:18
Latest activity Answered by jiro
on 2 Feb 2018 at 3:46

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次元空間でメダカを棒状で表示できるのではないかと思うのですが、そのやりかたが分かりません。どうかお助けください。

  0 Comments

Log in to comment.

2 Answers

Kei Otsuka
Answer by Kei Otsuka
on 1 Feb 2018 at 14:36
 Accepted Answer

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 Comment

Takuya Nagai on 2 Feb 2018 at 1:13

アドバイスありがとうございます!

Log in to comment.


jiro
Answer by jiro
on 2 Feb 2018 at 3:46

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]);

  0 Comments

Log in to comment.


Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today