据我所知,没有内置函数可以执行此计算,但这里有一个关于如何获取所需信息的想法......
首先,您需要从上面获取 RGB 图像,并将其转换为索引图像和颜色图。这是一种方法:
img = double(imread('nested_regions.png'))./255; % Load the RGB image
map = unique(reshape(img, [], 3), 'rows'); % Find the unique colors
labelImage = rgb2ind(img, map); % Get a labeled (i.e. indexed) image
nColors = size(map, 1);
接下来,您需要循环每个标记区域,创建一个蒙版,然后使用以下命令填充该蒙版中的任何“孔”imfill。如果填充区域包含图像其余部分不包含的标签值,则这些区域完全包含在您填充的区域中。下面的代码使用setdiff功能:
contains = cell(nColors, 1); % Storage for the contained region labels
str=' # | contains\n---+------------\n'; % String for displaying output
for iColor = 1:nColors
maskImage = (labelImage == iColor-1); % Mask of the current region
filledImage = imfill(maskImage, 'holes'); % Mask with holes filled
holeImage = (filledImage & ~maskImage); % Mask of the filled holes
contains{iColor} = setdiff(unique(labelImage(holeImage)), ...
unique(labelImage(~holeImage))).'; %.'
str = [str ' ' num2str(iColor-1) ' | ' num2str(contains{iColor}) '\n'];
end
imshow(labelImage, map, 'InitialMagnification', 60); % Display image
colorbar(); % with a colorbar
fprintf(str); % Create some formatted text output
运行上述命令后,您将得到以下结果:
# | contains
---+------------
0 | 1 2 3 4 5 6 7 8 9
1 | 3 4 5 7 9
2 | 3 4 5 7 9
3 |
4 | 3
5 | 3 4
6 |
7 | 3 4 5
8 |
9 | 3 4 5 7
![enter image description here](https://i.stack.imgur.com/v8wex.png)
例如,红色像素(标记为区域 7)围绕标记区域 3、4 和 5(分别为灰蓝色、紫色和石灰色)中的所有像素。有些区域不形成闭合轮廓,例如 6(浅紫色)和 8(橙色)。区域 1(绿色)实际上并未完全包含在区域 2(蓝色)中,因为一两个绿色的虚假像素位于蓝色区域之外。
希望这能给您一些想法!