【问题标题】:Is there a way in MATLAB to compute which discrete image regions enclose or are enclosed by another region?MATLAB 中有没有办法计算哪些离散图像区域包围或被另一个区域包围?
【发布时间】:2016-08-23 18:58:56
【问题描述】:

给定下图:

我想确定哪些颜色区域被其他颜色区域包围或包围。这如何计算?有没有办法创建一种显示这些信息的树或表?

示例:所有红色像素都在黄色区域内。

【问题讨论】:

    标签: image matlab image-processing computer-vision image-segmentation


    【解决方案1】:

    据我所知,没有内置函数可以执行此计算,但这里有一个关于如何获取所需信息的想法...

    首先,您需要从上方获取 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
    

    例如,红色像素(标记为区域 7)围绕标记区域 3、4 和 5(分别为灰蓝色、紫色和浅绿色)中的所有像素。某些区域不形成闭合轮廓,例如 6(浅紫色)和 8(橙色)。区域 1(绿色)实际上并未完全包含在区域 2(蓝色)中,因为一两个绿色的虚假像素位于蓝色区域之外。

    希望这能给你一些想法!

    【讨论】:

    • 美丽的答案。感谢分享!
    • 同意@rayryeng。美丽的答案,正是我试图找到的那种东西。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2014-02-22
    相关资源
    最近更新 更多