画像の長手方向の最長距離と短手方向の最長距離を出す構文について、算出した値を数値として出すことはできますか。
1 view (last 30 days)
Show older comments
Nagae Ryoya
on 23 Dec 2019
Answered: Hiroyuki Hishida
on 6 Jan 2020
以下のプログラムを用いて、'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]を算出
0 Comments
Accepted Answer
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かそうではないかに関わらず、コードがエラーを吐いた時にどうする、どう考えるといったことについて、あまり効果的な対応がとれていないように思われます。
よろしくおねがいします。
More Answers (1)
Hiroyuki Hishida
on 6 Jan 2020
Nagaeさん、
はじめに
「distmaxが変数でないことは把握しています」とのことですが、変数と定数、スカラーとベクトルなどの言葉の定義(日本語の意味、英語の意味でも良いです)を確認してください。これはMATLAB に限る話ではありません。なお、MATLABはベクトルであってもスカラーのように記述できる特徴があります。
デバッグ
さて、デバッグに関して見聞きしたことないのは、それはお困りでしょう。いくつか参考になるであろう情報を記載しますので、確認してみてください。
デバッグと解析
特に今回の件でしたら、ここが参考になると思います
また、実行して得られたワークスペースの変数をダブルクリックして開く、コマンドウィンドウに入力して確認してみるなどは、有効な手段です。その結果、思ってもいない結果が返ってくれば、その変数の計算がおかしいと言えます。
>> tatemax
>> distmax
>> pix
もしくは、結果を表示する関数を使って、プログラムを実行中に結果を追いかける方法もあります。
>> disp(気になる変数)
ご参考
コーディングを進められる前に、例えば以下のチュートリアルで自習されると良いかもしれません。
自前処理できるようになれば、不明点がでるたびにこの掲示板で都度書き込まれるよりも、よっぽど生産的になると思います。がんばってください。
0 Comments
See Also
Categories
Find more on Image Processing Toolbox in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!