MATLAB Answers

bwboundaries関数についてです。

4 views (last 30 days)
Nagae Ryoya
Nagae Ryoya on 10 Oct 2019
Commented: Etsuo Maeda on 23 Oct 2019
画像のセグメンテーション後、
閾値を設定し、
画像の二値化、
’imfill’を用いた二値化画像の穴埋め、
’bwmorph’によるエッジ化、
’imbidilate’,’imfill’,’imerode’を用いたモルフォロジー処理、
二値化画像のクリーンナップを行ったあと、bwboundaries関数を使いたいのですが、うまくいきません。
jpg拡張子の画像を読み込ませています。
解決策はありますか?

  2 Comments

Yoshio
Yoshio on 11 Oct 2019
どのようにうまくいかないのか、エラーが出るのか、意図したように動作しないのか、具体的に、できればデータとうまくいかないプログラムを添付して説明いただけないでしょうか。
Nagae Ryoya
Nagae Ryoya on 15 Oct 2019
%%画像入力
kaki_img=imread('box_dark.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>180;
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=bwmorph(kaki_th,'remove');
figure(6)
imshow(kaki_th,'Border','tight','InitialMagnification','fit');
%%モルフォロジー処理 膨張
kaki_th=imdilate(kaki_th,strel('disk',10));
figure(7)
imshow(kaki_th,'Border','tight','InitialMagnification','fit');
%%モルフォロジー処理 画像の塗りつぶし
kaki_th=imfill(kaki_th,'holes');
figure(8)
imshow(kaki_th,'Border','tight','InitialMagnification','fit');
%%モルフォロジー処理 収縮
kaki_th=imerode(kaki_th,strel('disk',10)); %モルフォロジー処理(元の画像大きさまで縮小)
figure(9)
imshow(kaki_th,'Border','tight','InitialMagnification','fit');
%%二値化画像のクリーンナップ(周囲の白を除去)
cc1=bwconncomp(kaki_th);
main1=regionprops(cc1,'Area');
A=[main1. Area];
[~,biggest]=max(A);
kaki_th(labelmatrix(cc1)~=biggest)=0; %最大の塊となっている1の要素以外の1の要素を0にする
figure(10)
imshow(kaki_th,'Border','tight','InitialMagnification','fit');
%%bwboundaries
BW=~imbinarize(kaki_th);
B=bwboundarize(BW,'noholes');
figure(11)
imshow(BW)
hold on
for kk=1:numel(B)
plot(B{kk}(:,2),B{kk}(:,1),'r','LineWidth',2)
end
というプログラムです。
エラーは以下のように出ます。
エラー: imbinarize
I は以下のいずれかのタイプが必要です:
uint8, uint16, uint32, int8, int16,
int32, single, double
実際の型は logical でした。
エラー: imbinarize>validateImage (line
261)
validateattributes(I,supportedClasses,supportedAttribs,mfilename,'I');
エラー: imbinarize>parseInputs (line
197)
validateImage(I);
エラー: imbinarize (line 133)
[I,isNumericThreshold,options] =
parseInputs(I,varargin{:});
エラー: matumaru2 (line 52)
BW=~imbinarize(kaki_th);
regionprops関数を並行利用することも確認します。
よろしくお願いします。

Sign in to comment.

Accepted Answer

Etsuo Maeda
Etsuo Maeda on 17 Oct 2019
Edited: Etsuo Maeda on 17 Oct 2019
レスポンスが止まっているみたいなので、回答しておきます。
エラー出力を下から読んでみてください。
エラー: imbinarize
I は以下のいずれかのタイプが必要です:
uint8, uint16, uint32, int8, int16,
int32, single, double
実際の型は logical でした。
エラー: imbinarize>validateImage (line
261)
validateattributes(I,supportedClasses,supportedAttribs,mfilename,'I');
エラー: imbinarize>parseInputs (line
197)
validateImage(I);
エラー: imbinarize (line 133)
[I,isNumericThreshold,options] =
parseInputs(I,varargin{:});
エラー: matumaru2 (line 52)
BW=~imbinarize(kaki_th);
"二値化画像のクリーンナップを行ったあと、bwboundaries関数を使いたいのですが、うまくいきません。"
と質問されていますが、bwboundaries関数でエラーになっているのではなく、その一行前の imbinarize関数でエラーになっています。
matumaru2 の imbinarizeでエラーになっているのは、imbinarize の validateImageでエラーになっていることが原因です。
validateImageが何をしているのかは、一見わからないと思いますが、エラーメッセージを読めばわかるはずです。
エラー: imbinarize
I は以下のいずれかのタイプが必要です:
uint8, uint16, uint32, int8, int16,
int32, single, double
実際の型は logical でした。
つまり、imbinarizeは
uint8, uint16, uint32, int8, int16,
int32, single, double
の入力を受け付けますが、実際に入力された kaki_th は logical であったためにエラーになっています。
doc imbinarize
で入力引数の制限を確認してみてください。
imbinarizeは入力を1/ 0 にする関数で、logicalの配列は最初から1/ 0 なので、当たり前といえば当たり前のエラーですね。
BW を kaki_th の1/ 0 を反転したものにしたいのであれば、
BW = ~kaki_th;
としておけば良さそうです。
HTH

  5 Comments

Show 2 older comments
Etsuo Maeda
Etsuo Maeda on 17 Oct 2019
繰り返しになってしまいますが、エラーメッセージを落ち着いて読んでみましょう。
(時々は、意味不明なエラーが返ることもありますが・・・)
関数としてスクリプト bwboundaries を実行
しようとしています:
E:\牡蠣 研究\keisoku2017
matumaru\bwboundaries.m
となっていますので、実行しようとしている menseki3_5.m の近い場所、
E:\牡蠣 研究\keisoku2017matumaru\
E:\牡蠣 研究\keisoku2017 matumaru\
にパスの通った自作のbwboundaries.mがあるはずです。
MATLABは同名の関数・スクリプトがある場合、実行対象からパス上にて最も近い場所にあるm-fileを呼び出します。
そのため、自作のbwboudaries.m を呼び出してエラーになっています。
rmpath('E:\牡蠣 研究\keisoku2017 matumaru\')
のようにして実行パスから削除するか、myBwboundaries.m のように名前を変えてください。
※ menseki3_5.mと自作のbwboundaries.mが同じ場所にある場合は、パスの削除は意味がありません。
余談ですが、日本語ファイル名は文字化けなどの原因になりますので、止めておいたほうが安全です。
HTH
Nagae Ryoya
Nagae Ryoya on 19 Oct 2019
ありがとうございます。エラーは解決しました。
ですが、さらに問題があり、質問の際に使用した画像とは異なる画像で、プログラムを実行しましたが、うまく二値化の黒い部分に沿って赤いラインがでませんでした。
bwboundaries関数の例にあるように黒い部分に沿わせたいと考えています。
よろしくお願いいたします。
kaki_box_bw_boundaries_file.png
Etsuo Maeda
Etsuo Maeda on 23 Oct 2019
BW — 入力バイナリ イメージ
の画をよくよく確認してみましょう。
HTH

Sign in to comment.

More Answers (0)

Sign in to answer this question.