画像処理後,面積などを抽出して保存する
27 views (last 30 days)
Show older comments
指定画像を読み込んだあと,
背景処理・2値化 ⇒ 面積等を抽出 ⇒ 値を保存(テキストなど)したいのですが,以下2つのエラーがでます。
どのように修正したらよいでしょうか。
・★エラー(double から structに変換できません。)がでて実行できません.
・★fprintf のところで、'AREA','MajorAxisLength','Centroid'の値を出力できませんでした.
宜しくお願いいたします
%画像,背景画像(8bit)を読み込み
img=imread('IMG001.tif');
imgb=imread('IMGB001.tif'); %背景だけの画像
%背景をカットして二値化
bw=img-imgb; %背景より明るいところを取り出します
bw=double(bw);
BW=imbinarize(bw,50); %50で二値化
%面積などを抽出
AREA=regionprops(BW,'Area');
MajorAxisLength=regionprops(BW,'MajorAxisLength');
Centroid=regionprops(BW,'Centroid');
%保存形式作成
A=[a; AREA; MajorAxisLength; Centroid]; % a = 1などの変数です
%★エラー struct%double から struct に変換できません。
%書き込み
fid = fopen('test.txt','w');
fprintf(fid,'%8s %18s %12s %8s \r\n','a','AREA','MajorAxisLength','Centroid');
fprintf(fid,'%8.1f %18.2f %18.2f %18.2f\n',A);
fclose(fid);
%★fprintf で'AREA','MajorAxisLength','Centroid'の値が出力きません
0 Comments
Accepted Answer
Atsushi Ohashi
on 16 Mar 2021
regionprops は戻り値が構造体になりますので、fprintfで値を書き込むには構造体の要素を指定します。
BWを求めたあとのサンプルのスクリプトになりますので、ご参照ください。
% Area, MajorAxisLength, Centroidを取得
props = regionprops(BW, 'Area', 'MajorAxisLength', 'Centroid');
% 構造体になっているため、配列の形にまとめる
A = [vertcat(props.Area), vertcat(props.MajorAxisLength), vertcat(props.Centroid)];
% 配列の1行ずつ書き込み
fid = fopen('test.txt','w');
fprintf(fid, '%8s %18s %12s %8s \n', 'a', 'AREA','MajorAxisLength','Centroid');
for n = 1: size(A, 1)
fprintf(fid,'%03d %8.1f %18.2f %18.2f %18.2f\n', n, A(n, :));
end
fclose(fid);
ご質問ではないですが、画像の差分で”ー”マイナスを利用されています。マイナスでも良い場合がありますが、image processingに画像間の差分を取る関数があるので、ご利用いただくと良いと思います。
6 Comments
Atsushi Ohashi
on 1 Apr 2021
Aのサイズを確認して空であれば、Aにゼロを代入するIF文を用意するのが良いのではないでしょうか。
サイズ確認はsizeやAが空の確認はisemptyが使えると思いますので下記をご参照ください。
https://jp.mathworks.com/help/matlab/ref/size.html
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!