質問: 画像の長手方向の最長距離と短手方向の最長距離を出す構文について、算出した値を数値として出すことはできますか。 以下のプログラムを用いて、'tatemax'を算出しています。 しかしながら、'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をベースに、対象物の長手方向と短手方向を写真でプロットして、最長距離を算出します。 %% 画像入力(寸法計算用) 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]を算出
回答: こんにちは。 以下のどこかに、tatemaxがスカラーにならない根本原因があります。tatemaxは掛け算で作成されているので、どちらかの変数もしくはその両方がスカラーではない、と推察できますね。考えてみてください。 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; 責めるつもりではないので、教えてください。 これまで、デバッグ方法について何か見聞きされたことはございますか?一連のやりとりをみていますと、matlabかそうではないかに関わらず、コードがエラーを吐いた時にどうする、どう考えるといったことについて、あまり効果的な対応がとれていないように思われます。 よろしくおねがいします。