次の「ゾーン」のマトリックスがあるとします
brk_group =
1 1 1 1
3 2 2 3
3 3 3 3
これらの値の「グループ化マトリックス」を作成したいと思います。グループは、同じゾーン値を持つ隣接セル (上、右、下、左) として定義されます。
ゾーンは空間的に結合する必要がないため、ゾーン値は複数のグループを持つことができます。
データ:
brk_group = [1 1 1 1; 3 2 2 3; 3 3 3 3]
以下の「MY CURRENT CODE」の何が問題なのか....
セル (2,4) のゾーン値 "3" は、セル (2,1) のゾーン値 "3" に接続されていますが、現在の回答のループが (2,4) に到達すると、この接続が表示されず、セル (2,1) と (2,4) を誤ってグループ解除して新しいグループを作成します...
編集: ベースの MATLAB のみを使用したいのですが、Image Processing Toolbox は使用しないでください! =)
明確化: ゾーンは、同じゾーン値を持つすべてのセルとして定義されます。グループは、同じゾーン値を持つすべての空間的に結合された (上、下、左、右) セルとして定義されます。
私の現在のコード:
function [groupMat groupIds] = createZoneGroups(zoneMat)
%
% groupMat = createZoneGroups(zoneMat)
%
% Groups zones spatially.
%
% Input:
% zoneMat: nxm matrix of "zones".
%
% Output:
% groupMat: nxm matrix of group ID's
% groupIds: An array of unique group ID's
%
% Note: A group is defined as spatially connected same zones. Diagonal
% cells are not spatially connected.
%
% Author: Kyle W. Purdon
%
groupIds = [];
groupMat = nan(size(zoneMat));
for rowIdx = 1:size(zoneMat,1)
for colIdx = 1:size(zoneMat,2)
% Check if the cell is nan, if so group(r,c)=nan
if isnan(zoneMat(rowIdx,colIdx))
continue;
end
% Check if the current cell has a group, if it does, break.
if ~isnan(groupMat(rowIdx,colIdx))
continue;
end
% Check the surrounding cells for groups, if any of the surrounding
% cells (1) have a group, and (2) are in the same zone, assighn the
% current cell that group. If not assign the current cell a new
% group.
% Check top cell
if rowIdx > 1 && ~isnan(groupMat(rowIdx-1,colIdx))
if isequal(zoneMat(rowIdx,colIdx),zoneMat(rowIdx-1,colIdx));
groupMat(rowIdx,colIdx) = groupMat(rowIdx-1,colIdx);
continue;
end
end
% Check right cell
if colIdx < size(zoneMat,2) && ~isnan(groupMat(rowIdx,colIdx+1))
if isequal(zoneMat(rowIdx,colIdx),zoneMat(rowIdx,colIdx+1));
groupMat(rowIdx,colIdx) = groupMat(rowIdx,colIdx+1);
continue;
end
end
% Check bottom cell
if rowIdx < size(zoneMat,1) && ~isnan(groupMat(rowIdx+1,colIdx))
if isequal(zoneMat(rowIdx,colIdx),zoneMat(rowIdx+1,colIdx));
groupMat(rowIdx,colIdx) = groupMat(rowIdx+1,colIdx);
continue;
end
end
% Check left cell
if colIdx > 1 && ~isnan(groupMat(rowIdx,colIdx-1))
if isequal(zoneMat(rowIdx,colIdx),zoneMat(rowIdx,colIdx-1));
groupMat(rowIdx,colIdx) = groupMat(rowIdx,colIdx-1);
continue;
end
end
% If the loop gets to this point, assign a new groupId to the cell.
if isempty(groupIds)
groupIds = 1; % Start with group #1
else
groupIds(end+1) = groupIds(end)+1; %Increment the last group by 1.
end
groupMat(rowIdx,colIdx) = groupIds(end);
end
end
end