質問: 顔の切り抜いた部分の重心を求めて、その点を結んだ三角形の面積を求めたい 顔の左目、右目、口の重心を求めてその重心点を結んだ三角形の面積を求めるプログラムを作りたいです。 画像のようにphotoshopで切り抜いた画像があるのですが、どのようなプログラムで進めたらいいか分かりません。 まだ勉強を始めたばかりなので教えていただけると幸いです。
回答: 重心位置の座標を表示したいのですが、どうやって組み合わせればいいのかわかりません - matlab answers - matlab central (mathworks.com) を参考にしました。regionprops関数で連結要素の重心を計算できます。比較的小さな連結要素も拾ってしまうので、面積の比較的大きな連結要素に絞ると目的の連結要素(目と口)のみ選択出来ました。 %% photoshop画像読込 icolor = imread('photoshop.png'); i = rgb2gray(icolor); % グレースケール化 bgc = i(10,10); % 背景色の選択 %% 目と口の重心を求める bw = i > bgc + 1 | i < bgc - 1; % (ほぼ)背景と背景以外で2値化(imbinarize) s = regionprops(bw,'centroid'); % イメージ内の連結要素の重心を計算 areas = regionprops(bw,'area'); % 各重心位置計算されたエリアの面積 centroids = cat(1,s.centroid); % 重心を格納する構造体配列を単一の行列に連結 centroids = centroids(cat(1,areas.area) > 10, :); % 面積の大きな連結要素のみ選択 %% 目と口の重心点を結んだ三角形の面積と重心を求める triangle = polyshape(centroids(:,1),centroids(:,2)); % 重心点を結んだ三角形を定義 triangle_area = area(triangle); % 三角形の面積 [trcntx,trcnty] = centroid(triangle); % 三角形の重心 %% グラフィック表示 imshow(icolor); hold on; plot(triangle); plot(trcntx,trcnty,'*','color','k'); text(trcntx+100,trcnty,['area:' num2str(triangle_area)]); text(trcntx-200,trcnty+30,['centroid:[' num2str(trcntx) ',' num2str(trcnty) ']']); hold off;