【问题标题】:detecting object in Homogeneous Intensity image在均匀强度图像中检测物体
【发布时间】:2013-02-02 19:53:51
【问题描述】:

我有Tiger's Pugmark(足迹印象)在泥土中的图像。我想检测 pugmark 的边界,但图像的强度是均匀的,即前景和背景无法根据强度变化进行区分。我该怎么做才能区分 pugmark 和背景。!

【问题讨论】:

  • 这个问题可能比你想象的更难。如果您详细说明该边界的进一步使用可能会有所帮助,即您需要什么精度?如果您只想检测 pugmark,或者知道它的方向,则不需要精确的边界。
  • 你注定要失败。 :-(.....这是一项极其困难的图像处理任务。
  • @RomanShapovalov 让我告诉你为什么我需要特别标记边界并丢弃不相关的区域。我需要分析 pugmark 并基于一些选定的特征,如 Pad 区域、脚趾区域、脚趾 2 和 3 之间的角度、pugmark 长度、宽度等,然后在将分析的图像与训练集进行比较后,我必须能够区分它是哪只老虎的 pugmark。

标签: matlab image-processing computer-vision edge-detection


【解决方案1】:

如果两者兼有,则在细分任务中

  1. 良好的标记;和
  2. 感兴趣的对象周围有明显的边缘

然后它直接通过分水岭变换解决。当然,问题在于获得这些标记,以及根据需要增强相关边缘。获取这些可能涉及特定问题的知识,而我没有针对您的问题的知识。

不过,有一些通用方法可能有用。例如,数学形态学中的连接算子用作合并和扩展平坦区域的一种方式。因此,也许它可以为我们提供相对较好的问题标记。在下图中,在原始图像(左图)的灰度版本中通过开运算(一种连通算子)进行形态学重建,剩余的区域最大值显示在右图。

现在,我们可以得到上图左图的形态梯度。我们还可以在上图中用一个小圆盘进行空洞填充和膨胀,以获得更平滑的轮廓——这定义了我们的标记图像。然后,使用我们的标记图像在渐变图像中应用分水岭变换,然后扩展(侵蚀或扩张,取决于您如何看待它)分水岭线,我们得到以下图像:

我怀疑您可以轻松丢弃太大和太小的区域。然后,如果您对爪子和手掌有一些粗略的预期尺寸,您可以丢弃不相关的区域。此时只需将区域扩大以形成单个组件并在原始图像中显示生成的轮廓:

执行每个步骤的示例代码(相关步骤也显示在注释的 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]]

【讨论】:

  • 感谢您的回答。让我告诉你为什么我需要特别标记边界并丢弃不相关的区域。我需要分析 pugmark 并基于一些选定的特征,如 Pad 区域、脚趾区域、脚趾 2 和 3 之间的角度、pugmark 长度、宽度等,然后在将分析的图像与训练集进行比较后,我必须能够区分它是哪只老虎的 pugmark。
  • @user2067773 好吧,我只是不知道你为什么这么告诉我。但是您描述的这种方法似乎跳过了一步:首先您需要有一种方法来确定您所拥有的是否是pugmark,否则分析它是没有意义的。
  • 是的,你是对的。我还没想过。但我首先关心的是掩盖背景并获得 pugmark 的清晰图像以供进一步分析。
  • @Suvidha 当然,对于这个例子,你的面具已经准备好了。只需考虑白色轮廓内的所有像素:i.imgur.com/W0MFYmQ.png。从答案中得到的想法是在分水岭分割中获取和使用标记(这里是通过考虑梯度来完成的,这是一种常见的方法)。
  • @Suvidha 我已经添加了 matlab 中最不明显的步骤的数学代码。
【解决方案2】:

@mmpg 答案中的方法可能不稳定,因为使用的算法需要设置参数,这可能针对每个图像。使用对形状具有先验知识的参数模型似乎可以更好地解决这个问题。

Active Shape Models 框架迭代地逼近形状的边界。首先,你用一些平均形状初始化它(图像只是插图,不是算法的实际输出):

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

然后将新轮廓拟合到数据以最大化这些分布乘以形状的先验分布。假设之前的统一,新的轮廓看起来像这样:

在实践中,您希望有一个非平凡的形状分布。要估计这一点,您需要一组训练图像,其中 pugmark 掩码是手动标记的。

你可能想试试this MATLAB implementation

【讨论】:

    猜你喜欢
    • 2015-10-01
    • 1970-01-01
    • 2014-09-16
    • 2016-08-24
    • 1970-01-01
    • 2016-08-29
    • 2019-06-28
    • 2015-01-26
    • 2014-05-06
    相关资源
    最近更新 更多