我正在尝试获得基于显着性的显着性图,我必须根据图形切割来分割图像,并找到每个修补程序的平均显着性。我能够分割图像,并获得原始图像的轮廓和显着性。轮廓显示分割图像的地图。图像如下所示。
我试图获得每个补丁或轮廓中的显着性值并获得其平均值。在走到这一步之后,我很难过,因为我无法想到一个清晰简单的方法。我在matlab中检查了activecontour,但是这个函数似乎做了不同的事情。基本上,我需要参考每个补丁。请帮我解决这个问题。 :如何在图像2指定的等值线图中获得原始图像(第一个)的平均显着性值?
提前致谢。
编辑:
通过补丁,我的意思是每个封闭的轮廓区域。
答案 0 :(得分:2)
我个人所做的就是使用imfill
填写等值线图中的所有“洞”。这将做的是它将搜索具有闭合轮廓的任何区域,然后用白色像素填充那些区域。执行完成后,使用bwlabel
,以便为您提供ID地图,其中为独立和连接区域分配唯一ID。完成此操作后,循环显示每个可能的ID,提取属于该ID的区域的像素,然后计算平均显着性。
编辑:如果您尝试使用我上面所说的imfill
,那么它可能只会为您填写整个对象,这可能不是您想要的。在你这样做之前我建议的是反转等高线图,使白线变黑。执行此操作后,使用填充的地图执行逻辑AND
操作,这样您就可以确定要分离连接的区域。
假设您有以下变量:
sal
- 您的显着性矩阵cmap
- 你的轮廓图 - 假设这是一张二进制图像。这是我要做的代码:
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
的平均显着性。
请记住,我没有测试过这个。这是我首先要尝试的。我不确定这是否是您正在寻找的答案。