C#OpenCV计算图像中的白点

问题描述 投票:0回答:1

嗨,我正在尝试计算这个图像中白点的数量和大小,我正在使用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

c# opencv
1个回答
1
投票

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

我不知道你问题的具体细节。对于这个小小的演示我模糊了一点,滤掉了所有(深色)灰色位,因为它们不是真正的“白色”(使用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

© www.soinside.com 2019 - 2024. All rights reserved.