質問: 画像の長手方向の最長距離と短手方向の最長距離を出す構文について、実際の値としての pix の値を用いずにピクセル値で算出する方法はありますか。 "画像の長手方向の最長距離と短手方向の最長距離を出すにはどうすればよいですか(以下の構文)" という質問への回答において、構文の中に"pix" が使用されていますが、これについてですが、比較のためのデータとして、"tatemax"である最長距離を算出したいと考えています。 方法はありますか? %%画像入力 kaki_img=imread('edge1.bmp'); figure(2) imshow(kaki_img) title('kaki image'); %%画像全体のセグメンテーション kaki_red=kaki_img(:,:,1); figure(3) imshow(kaki_red) title('kaki red plane'); %%画像の二値化 thresh=graythresh(kaki_red); kaki_th=imbinarize(kaki_red,thresh); figure(4) imshow(kaki_th); title('kaki_th'); %%二値化画像の穴埋め kaki_th=imfill(kaki_th,'holes'); figure(5) imshow(kaki_th); title('kaki_th(内部の穴埋め1回目)'); %%モルフォロジー処理 kaki_th=bwmorph(kaki_th,'remove'); figure(6) imshow(kaki_th); title('kaki_th(外周をプロット)'); %%モルフォロジー処理 膨張 kaki_th=imdilate(kaki_th,strel('disk',10)); figure(7) imshow(kaki_th); title('kaki_th(プロットした点を線で繋ぐ)'); %%モルフォロジー処理 画像の塗りつぶし kaki_th=imfill(kaki_th,'holes'); figure(8) imshow(kaki_th); title('kaki_th(線内部の塗りつぶし)'); %%モルフォロジー処理 収縮 kaki_th=imerode(kaki_th,strel('disk',10)); figure(9) imshow(kaki_th); title('kaki_th(画像の収縮)'); %%二値化画像のクリーンアップ(周囲の白を除去) cc1=bwconncomp(kaki_th); main1=regionprops(cc1,'area'); a=[main1.area]; [~,biggest]=max(a); kaki_th(labelmatrix(cc1)~=biggest)=0; figure(10) imshow(kaki_th); title('kaki_th(周囲のノイズ除去)'); %%画像のエッジ検出 kaki_th_edge=edge(kaki_th); figure(13) imshow(kaki_th_edge); [row,col]=find(kaki_th_edge); for k=1:330 for i=k+1:330 i=((row(k)-row(i)).^2); j=((col(k)-col(i)).^2); dist=sqrt(i+j); distmax=max(dist); end distmax=max(distmax); end bwdist=bwdistgeodesic(kaki_th_edge,col(1),row(1),'quasi-euclidean'); bwdistmax=max(bwdist); tatemax=distmax*pix; %%重心の検出 cc2=regionprops(kaki_th,'centroid'); centroids=cat(1,cc2.centroid); figure(11) imshow(kaki_th); hold on plot(centroids(:,1),centroids(:,2),'r*'); hold off %%画像を重ねる c=imfuse(kaki_th,kaki_img); figure(12) imshow(c); title('kaki_th(元画像との比較)'); pixについては、以下のプログラムと写真の一マスが10mmのため2マスの間隔をプロットすることで算出しています。 このpixをベースに、対象物の長手方向と短手方向を写真でプロットして、最長距離を算出します。 pixを用いることで、実際の対象物の長さを算出しているのですが、それぞれの大小関係を把握できれば良いため、pixを用いずに算出できたらなと考えています。 %% 画像入力(寸法計算用) sunpo=imread('base_box_scale.jpg'); figure(1) imshow(sunpo) [x,y,p]=impixel(sunpo); %クリックしたpixelの座標 %注) クリックsuru画像の点は20mmと定める [x,y]; %クリックした距離の間にあるpixelの数 dis1=(((x(2)-x(1))^2)+((y(2)-y(1))^2))^(1/2); %1回目と2回目 dis2=(((x(4)-x(3))^2)+((y(4)-y(3))^2))^(1/2); %3回目と4回目 dis3=(((x(6)-x(5))^2)+((y(6)-y(5))^2))^(1/2); %5回目と6回目 dis4=(((x(8)-x(7))^2)+((y(8)-y(7))^2))^(1/2); %7回目と8回目 dis5=(((x(10)-x(9))^2)+((y(10)-y(9))^2))^(1/2); %9回目と10回目も距離 disav=(dis1+dis2+dis3+dis4+dis5)/5; %dis1~5の平均値 pix=20/(disav); %disavの距離を20mmと最初に設定し,1pixelあたりの距離[mm]を算出
回答: nagae様、 お問い合わせ内容は、以下であってますでしょうか? 上記のプログラムは、写真画像から寸法測定を行うものであり、tatemaxには、あるところの長さ(単位cm)が入っている。 このtatemaxの単位を、cmから画素数に変更したい。 hishida