如何检测和计数螺旋的圈(How to detect and count a spiral's

2019-07-04 03:13发布

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

我曾尝试如下:

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

Answer 1:

你有一个很好的最后二值化那边,但它看起来像被太局限于这种单一的情况。 我会做一个相对比较简单,但可能更强劲,预处理允许相对较好的二值化。 从数学形态学,有一种被称为变换的h-圆顶,其用于通过抑制高度<最小值/最大值以除去无关的最小值/最大值h 。 此操作可能不会在你的图像处理库一应俱全,但也不是很难实现它。 为了这二值化预处理的图像,我选择了大津的方法,因为它是自动和统计最优。

这里是h-圆顶变换后的输入图像,并且将二值图像:

现在,计算的数量“螺旋圈”我做了一件很简单:我分裂螺旋这样我就可以数得过来的连接组件。 要分割他们我做了一个垂直线的单一形态开场,接着是一个扩张由单元的正方形。 这将产生以下的图像:

计数组件给出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');


文章来源: How to detect and count a spiral's turns