Clear Filters
Clear Filters

ROIの作成について

4 views (last 30 days)
ナッティング
ナッティング on 10 Sep 2023
初心者のものです。
画素値が含まれる600*600のデータがあります。
これに20個のROIを自在に動かせるように設置し、その各ROIから平均値と標準偏差をエクセルデータにまとめて出力できるコードを考えているところです。
ROIの色は"cyan"、形は四角形が希望です。
長々としたコードになりますが、コンパクトに仕上げる方法はありますでしょうか。
今の知識では、厳しいので質問させて頂きました。
よろしくお願い致します。
  1 Comment
Akira Agata
Akira Agata on 15 Sep 2023
いろいろなやり方が考えられますが、App Designer を使って簡単なアプリを作成するのが良いかと思います。マウス操作で動かせる四角形のROIの作成には drawrectangle、Excel での出力には writetable、画像ファイルの選択や出力Excelファイル名の指定には uigetfile/uiputfile をそれぞれ使えば比較的簡単に実現可能です。

Sign in to comment.

Answers (1)

交感神経優位なあかべぇ
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

Community Treasure Hunt

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

Start Hunting!