求一个轮廓/补丁matlab中的像素平均值

时间:2014-04-29 20:38:52

标签: image matlab image-processing contour image-segmentation

我正在尝试获得基于显着性的显着性图,我必须根据图形切割来分割图像,并找到每个修补程序的平均显着性。我能够分割图像,并获得原始图像的轮廓和显着性。轮廓显示分割图像的地图。图像如下所示。

The saliency map

The contour

我试图获得每个补丁或轮廓中的显着性值并获得其平均值。在走到这一步之后,我很难过,因为我无法想到一个清晰简单的方法。我在matlab中检查了activecontour,但是这个函数似乎做了不同的事情。基本上,我需要参考每个补丁。请帮我解决这个问题。 :如何在图像2指定的等值线图中获得原始图像(第一个)的平均显着性值?

提前致谢。

编辑:

通过补丁,我的意思是每个封闭的轮廓区域。

1 个答案:

答案 0 :(得分:2)

我个人所做的就是使用imfill填写等值线图中的所有“洞”。这将做的是它将搜索具有闭合轮廓的任何区域,然后用白色像素填充那些区域。执行完成后,使用bwlabel,以便为您提供ID地图,其中为独立和连接区域分配唯一ID。完成此操作后,循环显示每个可能的ID,提取属于该ID的区域的像素,然后计算平均显着性。

编辑:如果您尝试使用我上面所说的imfill,那么它可能只会为您填写整个对象,这可能不是您想要的。在你这样做之前我建议的是反转等高线图,使白线变黑。执行此操作后,使用填充的地图执行逻辑AND操作,这样您就可以确定要分离连接的区域。

假设您有以下变量:

  1. sal - 您的显着性矩阵
  2. cmap - 你的轮廓图 - 假设这是一张二进制图像。
  3. 这是我要做的代码:

    filledCMap = imfill(cmap); % Fill in holes for contour map.
    invertCMap = ~cmap; % Invert so that the white contour lines are black
    finalCMap = filledCmap & invertCMap; % Mask to ensure we separate the regions
    [labelMap, numLabels] = bwlabel(finalCMap); % Extract label map and number of labels
    
    aveSaliency = zeros(1, numLabels); % Store average saliency values here
    regionsSaliency = cell(1, numLabels); % Store which region corresponds to a particular ID
    
    % For each label we have...
    for i = 1 : numLabels
        map = labelMap == i; % Find the i'th region
        regionsSaliency{i} = map; % Store for visualization
        salValues = sal(map); % Extract those saliency values
        aveSaliency(i) = mean(salValues(:)); % Calculate the mean and store
    end
    

    此代码最终将完成的是计算与唯一ID关联的每个区域的平均显着性值。如果您想查看针对哪个特定区域计算的显着性,您可以执行imshow(regionsSaliency{i});,其中i是您想要的ID。显示此内容后,aveSaliency(i)会为您提供ID i的平均显着性。

    请记住,我没有测试过这个。这是我首先要尝试的。我不确定这是否是您正在寻找的答案。

相关问题