画像の長手方向の最長距離と短手方向の最長距離を出す構文について、算出した値を数値として出すことはできますか。
1 vue (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Nagae Ryoya
le 23 Déc 2019
Réponse apportée : Hiroyuki Hishida
le 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 commentaires
Réponse acceptée
Hiroyuki Hishida
le 24 Déc 2019
Modifié(e) : Hiroyuki Hishida
le 24 Déc 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 commentaire
Plus de réponses (1)
Hiroyuki Hishida
le 6 Jan 2020
Nagaeさん、
はじめに
「distmaxが変数でないことは把握しています」とのことですが、変数と定数、スカラーとベクトルなどの言葉の定義(日本語の意味、英語の意味でも良いです)を確認してください。これはMATLAB に限る話ではありません。なお、MATLABはベクトルであってもスカラーのように記述できる特徴があります。
デバッグ
さて、デバッグに関して見聞きしたことないのは、それはお困りでしょう。いくつか参考になるであろう情報を記載しますので、確認してみてください。
デバッグと解析
特に今回の件でしたら、ここが参考になると思います
また、実行して得られたワークスペースの変数をダブルクリックして開く、コマンドウィンドウに入力して確認してみるなどは、有効な手段です。その結果、思ってもいない結果が返ってくれば、その変数の計算がおかしいと言えます。
>> tatemax
>> distmax
>> pix
もしくは、結果を表示する関数を使って、プログラムを実行中に結果を追いかける方法もあります。
>> disp(気になる変数)
ご参考
コーディングを進められる前に、例えば以下のチュートリアルで自習されると良いかもしれません。
自前処理できるようになれば、不明点がでるたびにこの掲示板で都度書き込まれるよりも、よっぽど生産的になると思います。がんばってください。
0 commentaires
Voir également
Catégories
En savoir plus sur Image Processing Toolbox dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!