三次元表示を行いたい(三次元空間内でメダカを棒状で表示したい)のですが、あともう少しのアイデアが出ません。教えていただけないでしょうか?
3 ビュー (過去 30 日間)
古いコメントを表示
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 件のコメント
採用された回答
Kei Otsuka
2018 年 2 月 1 日
%メダカの位置やサイズを指定
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 件)
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]);
0 件のコメント
参考
カテゴリ
Help Center および File Exchange で 3 次元ボリューム イメージの処理 についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!