7

我需要检测一个螺旋形弹簧并计算其线圈匝数。

我试过如下:

Image<Bgr, Byte> ProcessImage(Image<Bgr, Byte> img)
{ 
    Image<Bgr, Byte> imgClone = new Image<Bgr,byte>( img.Width, img.Height);
    imgClone = img.Clone();
    Bgr bgrRed = new Bgr(System.Drawing.Color.Red);


    #region Algorithm 1


    imgClone.PyrUp();
    imgClone.PyrDown();
    imgClone.PyrUp();
    imgClone.PyrDown();
    imgClone.PyrUp();
    imgClone.PyrDown();

    imgClone._EqualizeHist();
    imgClone._Dilate(20);
    imgClone._EqualizeHist();
    imgClone._Erode(10);

    imgClone.PyrUp();
    imgClone.PyrDown();
    imgClone.PyrUp();
    imgClone.PyrDown();
    imgClone.PyrUp();
    imgClone.PyrDown();

    imgClone._EqualizeHist();
    imgClone._Dilate(20);
    imgClone._EqualizeHist();
    imgClone._Erode(10);


    Image<Gray, Byte> imgCloneGray = new Image<Gray, byte>(imgClone.Width, imgClone.Height);

    CvInvoke.cvCvtColor(imgClone, imgCloneGray, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_BGR2GRAY);

    imgCloneGray = imgCloneGray.Canny(c_thresh, c_threshLink);//, (int)c_threshSize);

    Contour<System.Drawing.Point> pts = imgCloneGray.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_EXTERNAL);

    CvInvoke.cvCvtColor(imgCloneGray, imgCloneYcc, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_GRAY2BGR);

    if (null != pts)
    {
        imgClone.Draw(pts, bgrRed, 2);
        imgClone.Draw(pts.BoundingRectangle, bgrRed, 2);
    }

    #endregion 

    return imgClone; 
}

输入图像 输出图像

我是一些如何获得春天但如何获得计数的人。我正在寻找算法。我目前不是在寻找速度优化。

这类似于数手指。弹簧螺旋非常薄,可以使用轮廓。还有什么可以做的。http://www.luna-arts.de/others/misc/HandsNew.zip

4

1 回答 1

3

你在那里有一个很好的最终二值化,但它看起来过于局限于这种单一的情况。我会做一个相对简单但可能更健壮的预处理,以实现相对较好的二值化。在数学形态学中,有一个称为 h-dome 的变换,它用于通过抑制高度 < 的最小值/最大值来去除不相关的最小值/最大值h。此操作可能在您的图像处理库中不可用,但实现起来并不难。为了对这个预处理图像进行二值化,我选择了 Otsu 的方法,因为它是自动的并且在统计上是最优的。

这是 h-dome 变换后的输入图像和二值图像:

在此处输入图像描述 在此处输入图像描述

现在,为了计算“螺旋圈”的数量,我做了一些非常简单的事情:我拆分了螺旋,这样我就可以将它们算作连接的组件。为了分割它们,我用一条垂直线做了一个形态开口,然后是一个基本正方形的单个膨胀。这将产生以下图像:

在此处输入图像描述

计算组件的数量为 15。由于其中有 13 个不是太接近,因此这种方法可以正确计算它们。左侧和右侧的组被计为一个组。

用于执行这些步骤的完整 Matlab 代码:

f = rgb2gray(imread('http://i.stack.imgur.com/i7x7L.jpg'));
% For this image, the two next lines are optional as they will to lead
% basically the same binary image.
f1 = imhmax(f, 30);
f2 = imhmin(f1, 30);
bin1 = ~im2bw(f2, graythresh(f2));

bin2 = bwmorph(imopen(bin1, strel('line', 15, 90)), 'dilate');
于 2013-01-02T13:48:16.847 回答