Ric*_*047 6 c# wpf counting emgucv
我需要检测螺旋形弹簧并计算其线圈圈数.
我试过如下:
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;
}
Run Code Online (Sandbox Code Playgroud)

我有些能够获得弹簧,但如何获得计数.我正在寻找算法.我目前不寻求速度优化.
这类似于计数手指.弹簧螺旋很薄,无法使用轮廓.还有什么可以做的.http://www.luna-arts.de/others/misc/HandsNew.zip
你在那里有一个很好的最终二值化,但它看起来太局限于这个单一的情况。我会进行相对简单但可能更稳健的预处理,以实现相对良好的二值化。从数学形态学来看,有一种称为 h-dome 的变换,用于通过抑制高度 < 的最小值/最大值来去除不相关的最小值/最大值h。此操作可能在您的图像处理库中不容易实现,但实现它并不难。为了对这个预处理图像进行二值化,我选择了 Otsu 的方法,因为它是自动的并且在统计上是最佳的。
这是 h-dome 变换后的输入图像和二值图像:

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

对组件进行计数得出 15。由于其中有 13 个不太接近,因此此方法可以正确计算它们。左侧和右侧的组被视为一个组。
用于执行这些步骤的完整 Matlab 代码:
f = rgb2gray(imread('https://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');
Run Code Online (Sandbox Code Playgroud)