Verfasst am: 29.10.2014, 00:58
Titel: Mittelwert von ROI
Werte MATLAB-Experten,
Ich habe einen Stapel von p MR-Schnittbildern, die in einer mxnxp Matrix gespeichert sind. Ich möchte in jedem Schnittbild die m/n-Koordinaten des Maximums ermitteln, rund um diesen Punkt ein ROI der Größe 5x5 legen und in diesem ROI den Mittelwert bestimmen.
Für diesen letzten Schritt könnte ich natürlich für jedes Schnittbild einen Vektor kreieren, der die 25 interessierenden Datenpunkte beinhaltet und dann den Mittelwert davon bestimmen. Das Anlegen dieses Vektors so wie ich das mache ist aber sehr umständlich und unelegant.
Wie könnte ich das besser lösen?
Code:
% Generate random matrix (10 slices)
A = rand(10,10,10)
% Get max and its coordinates in each slice for i = 1:size(A,3)
temp = A(:,:,i);
[max_temp,ind] = max(temp(:));
[ii,jj] = ind2sub([size(temp,1),size(temp,2)],ind);
maxA{i} = [max_temp ii jj];
end
% Get coordinates of ROI points around max for i = 1:size(maxA,2)
xCoord(i,1:5) = [maxA{i}(3)-2:1:maxA{i}(3)+2];
yCoord(i,1:5) = [maxA{i}(3)-2:1:maxA{i}(3)+2];
end
% Get mean of 25 points (5x5) defined by xCoord and yCoord % This could be solved as follows but what is more efficient? % for i = 1:size(maxA,2) % temp = [A(yCoord(i,1),xCoord(i,1),... % A(yCoord(i,1),xCoord(i,2),... % % A(yCoord(i,5),xCoord(i,5)]; % mean_maxA(i) = mean(temp); % end
Deine xCoord und yCoord sind gleich, da der Index je 3 ist.
War auch so frei und hab die Bezeichner für mich mal umbenannt.
Was soll passieren, wenn die Indizes von ROI am Rand liegen? Ich bin mal davon ausgegangen, dass sich der 5x5-Bereich um Max dann entsprechend verkleinert. zB. Maximum bei (1,2), dann wird der Mittelwert der Spalten 1 bis 4 und der Zeilen 1 bis 3 berechnet.
Code:
% Generate random matrix (10 slices)
A = rand(10,10,10);
% Get max and its coordinates in each slice
maxA = cell(1, size(A,3));
for i = 1:size(A,3)
temp = A(:,:,i);
[max_temp,ind] = max(temp(:));
[ii,jj] = ind2sub([size(temp,1),size(temp,2)],ind);
maxA{i} = [max_temp ii jj];
end
mean_maxA = zeros(1, size(maxA,2));
for i = 1:size(maxA,2) % Get indices of ROI points around max
zeilen = maxA{i}(2)-2:maxA{i}(2)+2;
spalten = maxA{i}(3)-2:maxA{i}(3)+2;
Vielen Dank für die Antwort. Diese Lösung ist viel einfacher, als das was ich gestern noch produziert habe (ich habe schließlich die Eckpunkte meines ROIs genutzt, um mittels poly2mask eine Maske zu erstellen, das Schnittbild damit zuzuschneiden und den Mittelwert von der 5x5 Region zu berechnen).
Idealerweise würde die ROI sich asymmetrisch rund um Max ausbreiten, wenn Max am Bildrand liegt. Ich bin sicher, das ließe sich mit einer if-Schleife lösen, vorerst reicht mir dieses Ergebnis aber schon mal.
Nochmals vielen Dank!
Robert
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.