スケーリングがうまくいきません。

24 views (last 30 days)
Nagae Ryoya
Nagae Ryoya on 29 Nov 2019
Answered: Kenta on 30 Nov 2019
%%画像入力
kaki_img=imread('kaki_prototype.jpg'); %画像読み込み
%kakiimg=imcrop(kakiimg)
figure(2)
imshow(kaki_img,'Border','tight','InitialMagnification','fit');
%%画像全体のセグメンテーション
kaki_red=kaki_img(:,:,1); %画像のセグメンテーション(赤要素検出)
figure(3)
imshow(kaki_red,'Border','tight','InitialMagnification','fit');
%%画像の二値化
kaki_th=kaki_red>145;
figure(4)
imshow(kaki_th,'Border','tight','InitialMagnification','fit');
%%二値化画像の穴埋め
kaki_th=imfill(kaki_th,'holes');
figure(5)
imshow(kaki_th,'Border','tight','InitialMagnification','fit');
%%二値化画像のクリーンナップ(周囲の白を除去)
kaki_th=bwareafilt(kaki_th,1);
figure(6)
imshow(kaki_th,'Border','tight','InitialMagnification','fit');
%%牡蠣の二値化画像の外周に色付け
% BW=imbinarize(I);
BW = kaki_th;
%%Detec boundarries
B=bwboundaries(kaki_th,'noholes');
figure(7)
imshow(BW)
hold on
for kk=1:numel(B)
%%'c'で色を固定
plot(B{kk}(:,2),B{kk}(:,1),'c','LineWidth',2)
end
stats=regionprops('table',BW,'Perimeter');
title(sprintf('boundary length is %d',stats.Perimeter))
size=stats*pix;
以上のプログラムを用いて、statsというものを算出しました。画像に青い円を描きその長さを出力しています。
このstatsはピクセル数にあたるため、実際の長さに変換したいと考えています。
以下のプログラムから、使用している画像における、スケールを出力し、算出しようとしましたが、うまくできませんでした。
どのようなプログラムを使用すれば可能でしょうか。
%% 画像入力(寸法計算用)
sunpo=imread('box_base.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]を算出
エラーは以下の通りです。
'table' 型の入力引数の演算子 '*'
未定義です。
エラー: sisaku (line 43)
size=stats*pix;
よろしくお願いします。
それぞれの画像は、二枚あるため、リンク先に載せてあります。画像(''box_base.jpg''と''kaki_prototype.jpg'')
  3 Comments
Nagae Ryoya
Nagae Ryoya on 30 Nov 2019
ワークスペースかなんかに、入力して、値は出ましたが、実際の値ではなく、ピクセル値が出てきてしまいます。
Kenta
Kenta on 30 Nov 2019
はい、それでピクセル値(ピクセル間距離の総和)がでますよね、それでピクセルあたりの実距離を掛け算して、距離をだそうとしているのですよね。stats自体は構造体で、出るはずで、エラーの原因はそのせいのはずです。つまり、エラーの原因はstats.Perimeterなどとしていないからで、ご質問にある目的を果たすためには、その値をもとにスケーリングしたらいいのではないでしょうか。

Sign in to comment.

Accepted Answer

Kenta
Kenta on 30 Nov 2019
ご質問の目的の値自体は、以下のようなコードで計算できます。
stats.Perimeterとして、ピクセル単位の距離を計算して、5回の平均で求めたピクセルあたりの距離でスケーリングしています。ただ、実際の値と整合性があるかは実際に正解と比べてみないとわからないです。
%%画像入力
kaki_img=imread('kaki_prototype.jpg'); %画像読み込み
%kakiimg=imcrop(kakiimg)
figure(2)
imshow(kaki_img,'Border','tight','InitialMagnification','fit');
%%画像全体のセグメンテーション
kaki_red=kaki_img(:,:,1); %画像のセグメンテーション(赤要素検出)
figure(3)
imshow(kaki_red,'Border','tight','InitialMagnification','fit');
%%画像の二値化
kaki_th=kaki_red>145;
figure(4)
imshow(kaki_th,'Border','tight','InitialMagnification','fit');
%%二値化画像の穴埋め
kaki_th=imfill(kaki_th,'holes');
figure(5)
imshow(kaki_th,'Border','tight','InitialMagnification','fit');
%%二値化画像のクリーンナップ(周囲の白を除去)
kaki_th=bwareafilt(kaki_th,1);
figure(6)
imshow(kaki_th,'Border','tight','InitialMagnification','fit');
%%牡蠣の二値化画像の外周に色付け
% BW=imbinarize(I);
BW = kaki_th;
%%Detec boundarries
B=bwboundaries(kaki_th,'noholes');
figure(7)
imshow(BW)
hold on
for kk=1:numel(B)
%%'c'で色を固定
plot(B{kk}(:,2),B{kk}(:,1),'c','LineWidth',2)
end
stats=regionprops('table',BW,'Perimeter');
title(sprintf('boundary length is %d',stats.Perimeter))
%% 画像入力(寸法計算用)
sunpo=imread('box_base.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]を算出
size=stats.Perimeter*pix;

More Answers (0)

Products


Release

R2019b

Community Treasure Hunt

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

Start Hunting!