画像処理後,面積などを抽出して保存する

指定画像を読み込んだあと,
背景処理・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'の値が出力きません

 Akzeptierte Antwort

Atsushi Ohashi
Atsushi Ohashi am 16 Mär. 2021

0 Stimmen

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 Kommentare

H.O
H.O am 18 Mär. 2021
Bearbeitet: H.O am 21 Mär. 2021
ありがとうございます! 少し確認作業をしておりますので、また書き込み致します。 取り急ぎ 宜しくお願い致します。
追記) 遅くなりまして申し訳ありません。 確認できました。ありがとうございました、助かりました。
画像間の差分についても、ご紹介ありがとうございました。
H.O
H.O am 1 Apr. 2021
申し訳ありません,追記としてもう少し教えていただけないでしょうか.
出力イメージを下記とします.nはnは画像ファイルの連番名です.
数字は適当な値です.
n Area MajorAxisLength Centroid
1 2005 50.01    25 50
2 2050 40.07    24 50
3 2150 42.45    25 40
% 配列の1行ずつ書き込み について
%nは画像ファイルの連番名称です.
fid = fopen('test.txt','w'); %'w' 入力は書き込みアクセス
fprintf(fid,'%6s %6s %16s %16s \r\n','n','Area','MajorAxisLength','Centroid');%タイトル
for n = 1:50
num = num2str(n);
IMG= imread(['IMG' num '.tif']); %データの読み出し
props=regionprops(IMG,'Area','MajorAxisLength','Centroid');
A=[vertcat(props.Area),vertcat(props.MajorAxisLength),vertcat(props.Centroid)];
fprintf(fid,'%7d %6.1f %6.2f %6.2f %6.2f\r\n',num,A(num,:));
end
にすると”
位置 1 のインデックスが配列範囲を超えています。のエラーがでます.
'Area','MajorAxisLength','Centroid'の値が下記のように出力できれば良いのですが,
どのように修正するとよいでしょうか?
Atsushi Ohashi
Atsushi Ohashi am 1 Apr. 2021
fprintfの箇所でnumを使っていらっしゃるようですが、数値ではないので、この辺りが怪しそうです。ただ、文面だけですとどこでエラーが発生しているか特定が難しいです。
エラーが発生している箇所でブレイクポイントを設定して原因を探すと解決へ向かうと思いますので、ブレイクポイントのご活用をお試しいただければと思います。
なお、先日回答いたしましたスクリプトに実際に1つのサンプル画像を読込んだスクリプトとして記載致します。このサンプルではエラーなくテキストへ出力できていると思いますので、こちらが動作するかもいっしょにご確認いただくと良いと思います。
rgb = imread('coloredChips.png');
g = rgb2gray(rgb);
BW = imbinarize(g);
% 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);
H.O
H.O am 1 Apr. 2021
ありがとうございます.
ブレイクポイントで確認しましたところ,
”位置 1 のインデックスが配列範囲を超えています。”のエラーが出るときは
Aの配列がカラのときのようです.このときの画像はただの黒い画像=0の行列で,面積などは抽出できない(⇒0 ?)画像でした,黒画像でなく何かが映っている画像であれば問題なく動くようです.
また,頂いたスクリプトで確認しましたところ,同じ黒い画像を読み込んだ時,
エラーにはなりませんが,Aの配列がカラでした.(他の画像であればエラーなく動くことも確認できました)
使っている画像は8bitの白黒画像(1000 ×1000pixel 程度)です.
1.黒画像のとき,カラの配列ではなく,0を出力するようにしたいのですが,どのようにすれば良いでしょうか?
2.面積や長さなどは画像1枚につき値1つを考えており,ワークスペースで確認できる行列Aを想定していました.
いただいたスクリプトですと,n⇒要素分?の値が保存されるので,行列Aとは異なる値が保存されていました(?)
勉強不足で申し訳ありませんが上記ご教示お願いできますでしょうか.よろしくお願いいたします. 
Atsushi Ohashi
Atsushi Ohashi am 1 Apr. 2021
Aのサイズを確認して空であれば、Aにゼロを代入するIF文を用意するのが良いのではないでしょうか。
サイズ確認はsizeやAが空の確認はisemptyが使えると思いますので下記をご参照ください。
https://jp.mathworks.com/help/matlab/ref/size.html
H.O
H.O am 2 Apr. 2021
isempty、IF文を使ってできるようになりました。 何度もご対応誠にありがとうございました。

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Produkte

Version

R2013a

Gefragt:

H.O
am 14 Mär. 2021

Kommentiert:

H.O
am 2 Apr. 2021

Community Treasure Hunt

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

Start Hunting!