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

조회 수: 2 (최근 30일)
Nagae Ryoya
Nagae Ryoya 2019년 12월 23일
답변: Hiroyuki Hishida 2020년 1월 6일
以下のプログラムを用いて、'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

채택된 답변

Hiroyuki Hishida
Hiroyuki Hishida 2019년 12월 24일
편집: Hiroyuki Hishida 2019년 12월 24일
こんにちは。
以下のどこかに、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
Nagae Ryoya
Nagae Ryoya 2020년 1월 1일
편집: Nagae Ryoya 2020년 1월 1일
見聞きしたことはないと思います。
distmaxが変数でないことは把握しています。

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

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

카테고리

Help CenterFile Exchange에서 Image Processing Toolbox에 대해 자세히 알아보기

제품


릴리스

R2019b

Community Treasure Hunt

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

Start Hunting!