下图显示了使用阈值处理和从3D深度图像中减去背景的组合检测到边界的母牛。
我的目标是在区域INSDIE边界上执行特征提取。我已经阅读了其他问题,并努力实施类似问题中所述的步骤。我不想在边界中提取区域,我只是想用它来进行特征提取。
有人可以提供一个可能更简单的解决方案吗?例如,有没有办法给extractSURFFeatures提供边界坐标?
下面是我的边界代码,它接收我处理过的阈值图像(BW1)。
figure(1);
imshow(ImageCell_int{i-269});
%title('Outlines, from bwboundaries()'); axis square;
hold on;
boundaries = bwboundaries(BW1);
numberOfBoundaries = size(boundaries);
for k = 1 : numberOfBoundaries
thisBoundary = boundaries{k};
plot(thisBoundary(:,2), thisBoundary(:,1), 'g', 'LineWidth', 2);
end
hold off;
如果有任何帮助,我将非常感激。
答案 0 :(得分:1)
太好了,现在我看到了牛! :)
您无法为detectSURFFeatures
函数指定不规则形状的感兴趣区域。但是,您可以检测整个图像中的要素,然后创建感兴趣区域的二进制掩码,并使用它来排除其外部的关键点。
编辑:如果您的边界表示为多边形,则可以使用roipoly
函数从中创建二进制蒙版。
话虽如此,在对象边界之外的特征实际上可能很有用,因为它们捕获有关对象形状的信息。
另外,你的最终目标是什么?如果您想识别单个奶牛,那么本地特征可能不是最好的方法。使用全局HOG描述符(extractHOGFeatures
)或颜色直方图或两者都可以做得更好。
答案 1 :(得分:1)
这个答案是在Matlab Central上发现的,并且完全解决了上述问题,对于那些在类似问题上挣扎的人来说。
从感兴趣对象(BW1)的灰度轮廓开始。
% Make the mask black and white
double(BW1);
BW2 = logical(BW1);
接下来,创建蒙版并将其强制为与普通图像相同的大小。
mask = cast(BW2, class(normalImage));
maskedImage = normalImage .* mask;
imshow(maskedImage);
产生以下结果:
现在可以对感兴趣的对象执行特征提取。