在均匀强度图像中检测物体

7
我有一张老虎掌印(足迹印迹)在泥土中的图像。我想检测掌印的边界,但是图像的强度是均匀的,即无法根据强度变化区分前景和背景。我该怎么办才能区分掌印和背景?! 老虎掌印

1
这个问题可能比你想象的更加困难。如果您详细说明边界的进一步使用,即您需要什么精度,可能会有所帮助。如果您只想检测犬爪印,或者知道它的方向,那么精确的边界是不必要的。 - Roman Shapovalov
你注定要失败了。 :-(..... 这是一个非常困难的图像处理任务。 - Shai
@RomanShapovalov,让我告诉你为什么我需要标记边界并丢弃无关区域。我需要分析足迹,并基于一些选定的特征,如垫面积、脚趾面积、第2和第3个脚趾之间的角度、足迹长度、宽度等,然后将分析后的图像与训练集进行比较,以区分是哪只老虎的足迹。 - Suvidha
2个回答

9
在分割任务中,如果您同时拥有以下两点:
1. 良好的标记; 2. 对感兴趣对象周围的边缘强度;
那么它可以直接通过 Watershed Transform 来解决。问题是当然要获得这些标记,并根据需要增强相关边缘。获得这些可能涉及特定于问题的知识,而我没有针对您的问题的这些知识。
尽管如此,还是有一些通用方法可能会有用。例如,数学形态学中的连接算子可用作合并和扩展平坦区域的方法。因此,它可能会为我们提供相对良好的标记。在下面的图像中,在原始图像的灰度版本(左图)上执行了开放式形态重建(一种连接算子),并且右边显示了剩余的区域最大值。
现在,我们可以获得上述左图像的形态梯度。我们还可以在上述右图像中进行孔填充和小圆盘膨胀,以获得更平滑的轮廓 - 这定义了我们的标记图像。然后,在使用我们的标记图像对渐变图像应用 Watershed Transform,然后扩展(依赖于您如何看待它,即腐蚀或膨胀)分水岭线之后,我们得到了以下图像:
我怀疑您可以轻松丢弃过大和过小的区域。然后,如果您对爪子和手掌有一些粗略的预期尺寸,您可以丢弃不相关的区域。此时,只需要扩大区域以形成单个组件,并在原始图像中显示结果轮廓即可。
每个步骤的执行示例代码(Matlab 代码的相关步骤也在注释中显示):
f = Import["http://imageshack.us/a/img407/4636/p1060993g.jpg"]
g = ColorConvert[f, "Grayscale"]                           (* g = rgb2gray(f); *)
(* First image shown: *)
geo = GeodesicOpening[g, DiskMatrix[5]]  (* geo = imreconstruct(imerode(g, ... *)
                                         (*         strel('disk', 6)), g);     *)
(* Second image shown: *)
marker = MaxDetect[geo]                        (* marker = imregionalmax(geo); *)

(* Watershed on gradient with markers. *)
mgrad = ImageSubtract[Dilation[geo, 1], Erosion[geo, 1]]; (* mgrad = ...       *)
          (* imdilate(geo,strel('square',3)) - imerode(geo,strel('square',3)); *)
ws = Image[           (* ws = watershed(imimposemin(mgrad, bwmorph(imfill(...  *)
 WatershedComponents[mgrad,      (* imregionalmax(geo),'holes'),'dilate'))));  *)
  Dilation[FillingTransform[marker], DiskMatrix[1]]]]

(* Third image shown: *)
wsthick = Erosion[ws // ImageAdjust, DiskMatrix[5]]

(* Connected component selection based on some supposed sizes. *)
ccs = SelectComponents[wsthick, "Count", 1000 < # < 3000 || 6000 < # < 10000 &]

(* Final image (thick border on binarized filled dilated ccs) *)
res = ImageAdd[f, Dilation[MorphologicalPerimeter[FillingTransform[
     MorphologicalPerimeter[Dilation[ccs, DiskMatrix[9]]]]], 2]]

谢谢你的回答。让我告诉你为什么我需要标记边界并丢弃不相关的区域。我需要分析足迹,并基于一些选定的特征,如垫面积、脚趾面积、第二和第三个脚趾之间的角度、足迹长度、宽度等,然后将分析后的图像与训练集进行比较,以区分是哪只老虎的足迹。 - Suvidha
@user2067773 好的,我不知道你为什么告诉我这个。但是看起来你在描述这个方法时跳过了一步:首先你需要有一个确定你所拥有的是印记还是其他东西的方法,否则分析就没有意义。 - mmgp
是的,你说得对。我还没有考虑过这个问题。但我的第一要务是掩盖背景并获取清晰的狗爪印图像以进行进一步分析。 - Suvidha
@Suvidha 当然,对于这个例子,您的掩模已经准备好了。只需考虑白色轮廓内部的所有像素:http://i.imgur.com/W0MFYmQ.png。从答案中可以得到的想法是通过分水岭中的标记进行分割的获取和使用(这里是通过考虑梯度来完成的,这是一种常见的方法)。 - mmgp
请问您能否分享一下您用于上述转换的Matlab代码?我有一些疑问。 - Suvidha
1
@Suvidha 我已经在Matlab中添加了数学代码,其中包含最不明显的步骤。 - mmgp

4
@mmpg的回答中的方法可能不稳定,因为所使用的算法需要设置参数,这些参数可能针对每个图像都是特定的。这个问题似乎可以通过具有关于形状的先验知识的参数模型更好地解决。 Active Shape Models框架迭代地逼近形状的边界。首先,您使用某个平均形状进行初始化(图像仅为示例,不是算法的实际输出):

Initialization of the shape

轮廓由锚点定义(仅为了避免混乱,蓝色刻度线只适用于手掌)。在每次迭代中,算法考虑每个锚点的正交方向,并估计每个距离处边界的概率(通常使用图像梯度,但在您的情况下应该更加复杂 - 可能是纹理差异,例如文本元素直方图之间的距离)。这里的红点突出显示了分布的最大值:

Modes of the edge-ness distribution

然后,新的轮廓将适应数据,以最大化这些分布乘以形状的先验分布。假设有均匀的先验分布,新的轮廓将如下所示:

The new contour

在实践中,您希望具有非平凡的形状分布。为了估计这一点,您将需要一个图像训练集,其中豹印掩模是手动标记的。
您可能想尝试此MATLAB实现

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接