MATLAB Answers

画像の長手方向の最長​​​​距離と短手方向​の​最​長​距離を出​す構​文に​ついて、​算出した値を数値とし​て出すことはできます​か。

4 views (last 30 days)
以下のプログラムを用いて、'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]を算出
box_base.JPG

Accepted Answer

Hiroyuki Hishida
Hiroyuki Hishida on 24 Dec 2019
Edited: Hiroyuki Hishida on 24 Dec 2019
こんにちは。
以下のどこかに、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かそうではないかに関わらず、コードがエラーを吐いた時にどうする、どう考えるといったことについて、あまり効果的な対応がとれていないように思われます。
よろしくおねがいします。
  1 Comment
Nagae Ryoya
Nagae Ryoya on 1 Jan 2020
見聞きしたことはないと思います。
distmaxが変数でないことは把握しています。

Sign in to comment.

More Answers (1)

Hiroyuki Hishida
Hiroyuki Hishida on 6 Jan 2020
Nagaeさん、
はじめに
「distmaxが変数でないことは把握しています」とのことですが、変数と定数、スカラーとベクトルなどの言葉の定義(日本語の意味、英語の意味でも良いです)を確認してください。これはMATLAB に限る話ではありません。なお、MATLABはベクトルであってもスカラーのように記述できる特徴があります。
デバッグ
さて、デバッグに関して見聞きしたことないのは、それはお困りでしょう。いくつか参考になるであろう情報を記載しますので、確認してみてください。
デバッグと解析
特に今回の件でしたら、ここが参考になると思います
また、実行して得られたワークスペースの変数をダブルクリックして開く、コマンドウィンドウに入力して確認してみるなどは、有効な手段です。その結果、思ってもいない結果が返ってくれば、その変数の計算がおかしいと言えます。
>> tatemax
>> distmax
>> pix
もしくは、結果を表示する関数を使って、プログラムを実行中に結果を追いかける方法もあります。
>> disp(気になる変数)
ご参考
コーディングを進められる前に、例えば以下のチュートリアルで自習されると良いかもしれません。
自前処理できるようになれば、不明点がでるたびにこの掲示板で都度書き込まれるよりも、よっぽど生産的になると思います。がんばってください。

Products


Release

R2019b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!