ROIの作成について
8 views (last 30 days)
Show older comments
初心者のものです。
画素値が含まれる600*600のデータがあります。
これに20個のROIを自在に動かせるように設置し、その各ROIから平均値と標準偏差をエクセルデータにまとめて出力できるコードを考えているところです。
ROIの色は"cyan"、形は四角形が希望です。
長々としたコードになりますが、コンパクトに仕上げる方法はありますでしょうか。
今の知識では、厳しいので質問させて頂きました。
よろしくお願い致します。
1 Comment
Akira Agata
on 15 Sep 2023
いろいろなやり方が考えられますが、App Designer を使って簡単なアプリを作成するのが良いかと思います。マウス操作で動かせる四角形のROIの作成には drawrectangle、Excel での出力には writetable、画像ファイルの選択や出力Excelファイル名の指定には uigetfile/uiputfile をそれぞれ使えば比較的簡単に実現可能です。
Answers (1)
交感神経優位なあかべぇ
on 27 Sep 2023
ROIを自在に動かせるアプリを試しに作ってみました。表示している平均値と標準偏差はRGB毎の平均と標準偏差です。
何か参考になれば...
(四角形のROIにdrawrectangleを使用していますので、ImageProccesingToolboxが必要です。)
ROIApp(imread('peppers.png')); % ROIAppの引数にRGBのデータを入れる。
function ROIApp(img)
ROI_NUM = 20; % ROIを設定する数
DEFAULT_ROI_SIZE = [40,40]; % 横×縦
hf = uifigure();
topGrid = uigridlayout(hf,'RowHeight',{'1x'},'ColumnWidth',{'1x',350},'Padding',[1,1,1,1],'ColumnSpacing',1,'RowSpacing',1);
haxes = axes(topGrid,'Position',[0,0,1,1],'DataAspectRatio',[1,1,1],...
'NextPlot','add','Interactions',[],'XLim',[1,size(img,2)+1],'YLim',[1,size(img,1)+1],...
'YDir','reverse');
haxes.Toolbar.Visible = 'off'; %axesのツールバーは不要なので非表示
haxes.XAxis.Visible = false; % X軸非表示
haxes.YAxis.Visible = false; % Y軸非表示
image(haxes,[1,size(img,2)]+0.5, [1,size(img,1)]+0.5, img); % 画像の表示。(1ピクセル目の左端がちょうど1にくるように調整)
allRectanles = arrayfun(@(i) drawrectangle(haxes,'Position',[1,1,DEFAULT_ROI_SIZE],'Visible',false,'Color','cyan'),1:ROI_NUM); % ROIの配置(デフォルト非表示)
menuGrid = uigridlayout(topGrid,'RowHeight',{'1x',25},'ColumnWidth',{'1x'},'Padding',[1,1,1,1]);
htable = uitable(menuGrid,'ColumnName',["表示","平均値RGB","標準偏差RGB"],'ColumnEditable',[true,false,false],...
'Data',[repmat({false},ROI_NUM,1),repmat({'-'},ROI_NUM,2)],'CellEditCallback',@(src,event)TableCallback(event,allRectanles), ...
'UserData',zeros(ROI_NUM,6)); % UserDataの列は平均のRGB、標準偏差のRGBの値を入れる。
addlistener(allRectanles,'MovingROI',@(src,event)MovingFcn(src, event, size(img,[1,2]))); % ROIを動かしたときのイベント検知
addlistener(allRectanles,'ROIMoved',@(src,event)ROIMoved(src, allRectanles, htable, img)); % ROIの大きさが確定(クリックを離した)したときのイベント検知
uibutton(menuGrid,'ButtonPushedFcn',@(src,event)ExcelExportFcn(htable),'Text','Excelへ書き込み');
end
function TableCallback(event,hrectangles)
hrectangles(event.Indices(1)).Visible = event.EditData; % rectangleの表示、非表示の切替
end
function ExcelExportFcn(htable)
% 省略 htable.UserDataの値をwritematrixなどで、Excelに書き込む
end
function MovingFcn(hrectangle,event,imgsize)
% rectangleの大きさを整数単位(ピクセル単位)にし、かつ、画像の枠からはみ出ないようにする。
pos = round(event.CurrentPosition);
pos(1) = max(pos(1),1);
pos(1) = min(pos(1),imgsize(2)-pos(3)+1);
pos(2) = max(pos(2),1);
pos(2) = min(pos(2),imgsize(1)-pos(4)+1);
hrectangle.Position = pos;
end
function ROIMoved(hrectangle, allRectangles, htable, img)
pos = hrectangle.Position;
tgtImg = double(img(pos(2):pos(2)+pos(4)-1,pos(1):pos(1)+pos(3)-1,:)); % 枠の中におさまっているピクセルを抽出
ave = mean(tgtImg,[1,2]);% RBGそれぞれの平均
stdval = std(tgtImg,1,[1,2]); % RGBそれぞれの標準偏差
row = allRectangles == hrectangle; % rectangleの対象の行の検索
htable.Data(row,[2,3]) = {MyNum2Str(ave),MyNum2Str(stdval)}; % テーブルデータに値を表示
htable.UserData(row,:) = [reshape(ave, 1, 3), reshape(stdval, 1, 3)]; % 実データをテーブルに保存
end
function str = MyNum2Str(num)
str = ['[', strjoin(compose('%.1f',num),', '), ']']; % テーブルへの値の表示文字列を作成
end
0 Comments
See Also
Categories
Find more on スプレッドシート in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!