C#OpenCV计算图像中的白点

时间:2017-12-26 13:40:37

标签: c# opencv

您好我正在尝试计算此图像中白点的数量和大小我正在使用opencv,我能够用完美的圆圈做到这一点但我不能用这个不规则的点来做。

private void button1_Click(object sender, EventArgs e)
{

    Mat train = new Mat("blob.jpg", ImreadModes.GrayScale);
    SimpleBlobDetector[] blobs;

    CircleSegment[] circles;
    Mat dst = new Mat();

    Cv2.GaussianBlur(train, dst, new OpenCvSharp.Size(5, 5), 1.5, 1.5);
    circles = Cv2.HoughCircles(dst, HoughMethods.Gradient, 1, 25, 75, 60, 1, 200);

    for (int i = 0; i < circles.Length; i++)
    {
        Cv2.Circle(dst, circles[i].Center, (int) circles[i].Radius, new Scalar(125), 2);
    }

    using (new Window("Circles", dst))
    {
        Cv2.WaitKey();
    }

}

Image

1 个答案:

答案 0 :(得分:1)

使用HoughCircles,你需要大量的迭代来尝试不同的参数,这可能不是你想要的。

我不知道你问题的具体细节。对于这个小演示,我模糊了一个  bit,过滤掉所有(深色)灰色位,因为它们不是真正的“白色”(使用otsu的阈值)。然后我简单地应用findContours并将它们全部绘制出来。这是Java代码,我可以得到第一件事。不过,您应该能够理解并指导您找到问题的解决方案。

我能想到的另一个可能的解决方案是使用OpenCV的特征探测器(例如简单的斑点探测器)。

Mat gray = new Mat();
Imgproc.cvtColor(img, gray, Imgproc.COLOR_BGR2GRAY);
Mat blur = new Mat();
Mat kernel = Mat.ones(2, 2, CvType.CV_8UC1);
Imgproc.morphologyEx(gray, blur, Imgproc.MORPH_OPEN, kernel);
Mat thresh = new Mat();
Imgproc.threshold(blur, thresh, 0, 255, Imgproc.THRESH_OTSU);

List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat hierarchy = new Mat();
Imgproc.findContours(thresh, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
Imgproc.drawContours(img, contours, -1, new Scalar(0, 0, 255), 1);

enter image description here