2013-02-18 95 views
7

我有泥土中的Tiger's Pugmark(足迹印象)图像。我想检测pugmark的边界,但图像的强度是一致的,根据强度变化无法区分前景和背景。我能做些什么来区分pugmark和背景。在均匀强度图像中检测物体

tiger's pugmark http://imageshack.us/a/img407/4636/p1060993g.jpg

+1

这个问题可能比您想象的更困难。如果您详细说明该边界的进一步用法,即您需要什么精度,这可能会有所帮助。如果您只想检测pugmark,或知道其方向,则不需要精确的边界。 – 2013-02-18 12:11:05

+0

你注定了。 : - (.....这是一个极其困难的图像处理任务 – Shai 2013-02-18 13:23:07

+0

@RomanShapovalov让我告诉你为什么我需要标记边界并丢弃无关区域我需要分析pugmark并根据一些选定的特征像垫区,脚趾区域,脚趾2和3之间的角度,pugmark长度,宽度等,然后在比较分析图像和训练集之后,我必须能够区分哪个老虎的pugmark是 – Suvidha 2013-02-19 06:43:46

回答

7

在细分任务,如果你有两个

  1. 良好的标记;和周围的兴趣

对象

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

    尽管如此,还是有一些通用的方法可能有用。例如,数学形态学的相关操作员可以用来合并和扩展平坦区域。因此,也许它可以给我们相对较好的问题标记。在下面的图像中,在原始图像的灰度版本(左图像)中执行通过打开(一种连接的操作符)进行的形态重建,剩余的区域最大值显示在右边。现在

    enter image description hereenter image description here

    ,我们可以得到上面的左图像的形态梯度。我们也可以在上面的右图中用小圆盘进行填孔和扩张,以获得更加平滑的轮廓 - 这定义了我们的标记图像。然后,将使用我们的标记图像,然后扩大梯度图像中的分水岭(侵蚀或扩张,取决于你怎么看它)的分界线,我们得到以下图片:

    enter image description here

    我怀疑你可以轻松地丢弃太大和太小的区域。然后,如果您对爪子以及手掌有一些粗糙的预期尺寸,则可以丢弃不相关的区域。在这一点上是唯一的扩张的区域,以形成一个单一的部件,并显示在原始图像中所得到的轮廓的问题:用于执行每一个步骤

    enter image description here

    示例代码(的相关步骤也示于注释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]] 
    
  • +0

    谢谢你的回答让我告诉你为什么我需要标记边界并丢弃不相关的区域,我需要根据Pad区域,脚趾区域,脚趾2和3之间的角度,pugmark长度,宽度,等等,然后在比较分析后的图像和训练集之后,我必须能够区分哪只老虎是pugmark。 – Suvidha 2013-02-19 05:21:23

    +0

    @ user2067773好吧,我只是不知道你为什么告诉我这些。但是你似乎跳过了你描述的这种方法的一步:首先你需要有一种方法来确定你所拥有的是否是pugmark,否则分析它是毫无意义的。 – mmgp 2013-02-19 05:40:43

    +0

    是的,你是对的。我没有想过。但我首先关心的是掩盖背景并获得进一步分析的足迹的清晰图像。 – Suvidha 2013-02-19 05:48:55

    3

    在@ MMPG的回答该方法可能是不稳定的,因为所使用的算法需要的参数,其可以是特定于每个图像设置。这个问题似乎更好地通过参数化模型来处理,这些参数化模型具有关于形状的先验知识。

    Active Shape Models框架迭代地近似形状的边界。首先,你的一些平均形状初始化(图片只是说明,而不是算法的实际输出):

    Initialization of the shape

    轮廓由锚点定义(由蓝色蜱所示,只为手掌以避免混乱)。在每次迭代中,算法考虑每个锚点中的正交方向并估计每个距离处的边界概率(通常使用图像梯度),但在您的情况下,它应该更复杂 - 可能是纹理的差异,例如histograms of textons )。该分布的红色这里点亮点ARG-最大值:

    Modes of the edge-ness distribution

    然后将新轮廓拟合到数据以最大化乘以形状的先验分布的那些分布。事先假设一致,新的轮廓是这样的:

    The new contour

    在实践中,你想有一个不平凡的形状分布。为了估计这一点,您需要一组手动标记pugmark蒙版的图像。

    你可能想尝试this MATLAB implementation