画像の長手方向の最長​​​距離と短手方向の​最​長​距離を出す構​文に​ついて、実際の​値とし​ての pix の値を用いずにピクセ​​ル値で算出する方法​は​ありますか。

4 views (last 30 days)
Nagae Ryoya
Nagae Ryoya on 17 Oct 2019
Commented: Yoshio on 19 Oct 2019
"画像の長手方向の最長​距離と短手方向の最長​距離を出すにはどうす​ればよいですか(以下の構文)" という質問への回答において、構文の中に"pix" が使用されていますが、これについてですが、比較のためのデータとして、"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をベースに、対象物の長手方向と短手方向を写真でプロットして、最長距離を算出します。
pixを用いることで、実際の対象物の長さを算出しているのですが、それぞれの大小関係を把握できれば良いため、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]を算出
base_box_scale.jpg

Answers (1)

Hiroyuki Hishida
Hiroyuki Hishida on 18 Oct 2019
Nagae様、
お問い合わせ内容は、以下であってますでしょうか?
上記のプログラムは、写真画像から寸法測定を行うものであり、tatemaxには、あるところの長さ(単位cm)が入っている。
このtatemaxの単位を、cmから画素数に変更したい。
Hishida
  2 Comments
Nagae Ryoya
Nagae Ryoya on 19 Oct 2019
そのような内容で合っています。
本来、cm単位で行いたいのですが、毎回最初に10点プロットするのが面倒なため、10点プロットせずにcm単位が算出できればと考えていました。
ですので、10点プロットせずにcm単位のtatemaxを出すことが理想です。
しかし、各画像の大小関係の程度が把握できれば良いと考え、質問させていただきました。
宜しくお願い致します。
Yoshio
Yoshio on 19 Oct 2019
[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
で計算されているdistmaxは、使えないのでしょうか?

Sign in to comment.

Categories

Find more on Image Processing Toolbox in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!