Opencv 打开cv查找图像中的白色峰值

Opencv 打开cv查找图像中的白色峰值,opencv,Opencv,我有以下图像: 我想找到不同周期特征的白色中心。我把我要找的东西标上了小红点。边缘模糊的,我不在乎。只有中间的特征。什么openCv方法最适合实现我想要的 我试着在我的图像上使用,但结果并不接近 多亏了下面的答案,我才想出了这个解决方案(使用C#library包装器OpenCV sharp): 方法: private List<Point> GetPeaks(Mat mat) { Mat findPeaksMat = new Mat(); m

我有以下图像:

我想找到不同周期特征的白色中心。我把我要找的东西标上了小红点。边缘模糊的,我不在乎。只有中间的特征。什么openCv方法最适合实现我想要的

我试着在我的图像上使用,但结果并不接近

多亏了下面的答案,我才想出了这个解决方案(使用C#library包装器OpenCV sharp):

方法:

private List<Point> GetPeaks(Mat mat)
    {
        Mat findPeaksMat = new Mat();
        mat.ConvertTo(findPeaksMat, MatType.CV_8UC1);
        Cv2.Threshold(findPeaksMat, findPeaksMat, 100, 255, ThresholdTypes.Binary);

        Point[][] contours;
        HierarchyIndex[] hierarchy;
        Cv2.FindContours(findPeaksMat, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);
        var points = ContoursCenter(contours, true);

        return points.Where(p => p.X >= 0 && p.Y >= 0).ToList();
    }


    private List<Point> ContoursCenter(Point[][] contours,bool centerOfMass,int contourIdx = -1)
    {
        List<Point> result = new List<Point>();
        if (contourIdx > -1)
        {
            if (centerOfMass)
            {
                Moments m = new Moments(contours[contourIdx], true);
                result.Add(new Point(m.M10/m.M00, m.M01/m.M00));
            }
            else 
            {
                Rect rct = Cv2.BoundingRect(contours[contourIdx]);
                result.Add(new Point(rct.X + rct.Width / 2 , rct.Y + rct.Height / 2));
            }
        }
        else 
        {
            if (centerOfMass)
            {
                for (int i = 0; i < contours.Length; i++)
                {
                    Moments m = new Moments(contours[i], true);
                    result.Add(new Point(m.M10 / m.M00, m.M01 / m.M00));
                }
            }
            else 
            {
                for (int i = 0; i < contours.Length; i++)
                {
                    Rect rct = Cv2.BoundingRect(contours[i]);
                    result.Add(new Point(rct.X + rct.Width / 2 , rct.Y + rct.Height / 2));
                }
            }
        }

        return result;
    }
private List GetPeaks(Mat-Mat)
{
Mat findPeaksMat=新Mat();
材料转换器(findPeaksMat,材料类型CV_8UC1);
阈值(findPeaksMat,findPeaksMat,100255,ThresholdTypes.Binary);
点[]等高线;
层次索引[]层次结构;
Cv2.FindContours(findPeaksMat、out轮廓、out层次、RetrievalModes.External、ContourApproximationModes.ApproxSimple);
var点=轮廓仪(轮廓,真);
返回点。其中(p=>p.X>=0和&p.Y>=0)。ToList();
}
私有列表轮廓仪(点[][]轮廓,布尔质量中心,int contourIdx=-1)
{
列表结果=新列表();
如果(轮廓线>-1)
{
if(质量中心)
{
力矩m=新力矩(等高线[contourIdx],真);
结果.添加(新点(m.M10/m.M00,m.M01/m.M00));
}
其他的
{
Rect rct=Cv2.BoundingRect(等高线[contourIdx]);
结果。添加(新点(rct.X+rct.Width/2,rct.Y+rct.Height/2));
}
}
其他的
{
if(质量中心)
{
对于(int i=0;i
我认为
对图像进行阈值化,找到轮廓,按面积过滤轮廓,并计算中心将完成这项工作


我认为
对图像进行阈值化、找到轮廓、按面积过滤轮廓并计算中心将完成这项工作


这个问题很简单。您可以使用以下两种方法之一:

  • 轮廓检测和基于轮廓面积的阈值化
  • 连接组件分析和基于组件面积的阈值 注意:由于您尚未添加原始图像,因此我从另一个答案中获取了该图像!如果你附上原始图像,我很乐意适当调整答案

    守则:

    import cv2
    import numpy as np
    
    arr = cv2.imread("U:/SO/Lvw2I.png")`
    imgray = cv2.cvtColor(arr, cv2.COLOR_BGR2GRAY)
    ret, thresh = cv2.threshold(imgray, 127, 255, 0)
    # Based on contours
    im2, contours, heirarchy = cv2.findContours(thresh, cv2.RETR_TREE, 
    cv2.CHAIN_APPROX_SIMPLE)
    for cnt in contours:
        if cv2.contourArea(cnt) > 120:
            cv2.drawContours(arr, [cnt], 0, (0, 255, 0), 3)
    
    # Based on CCA
    labelnum, labelimg, contours, GoCs = cv2.connectedComponentsWithStats(imgray)
    for label in range(1, labelnum):
        x, y = GoCs[label]
        x, y, w, h, size = contours[label]
        if size >= 180:
            img = cv2.rectangle(imgray, (x, y), (x+w, y+h), (255, 255, 0), 1)
    
    结果:


    希望有帮助

    这个问题很简单。您可以使用以下两种方法之一:

  • 轮廓检测和基于轮廓面积的阈值化
  • 连接组件分析和基于组件面积的阈值 注意:由于您尚未添加原始图像,因此我从另一个答案中获取了该图像!如果你附上原始图像,我很乐意适当调整答案

    守则:

    import cv2
    import numpy as np
    
    arr = cv2.imread("U:/SO/Lvw2I.png")`
    imgray = cv2.cvtColor(arr, cv2.COLOR_BGR2GRAY)
    ret, thresh = cv2.threshold(imgray, 127, 255, 0)
    # Based on contours
    im2, contours, heirarchy = cv2.findContours(thresh, cv2.RETR_TREE, 
    cv2.CHAIN_APPROX_SIMPLE)
    for cnt in contours:
        if cv2.contourArea(cnt) > 120:
            cv2.drawContours(arr, [cnt], 0, (0, 255, 0), 3)
    
    # Based on CCA
    labelnum, labelimg, contours, GoCs = cv2.connectedComponentsWithStats(imgray)
    for label in range(1, labelnum):
        x, y = GoCs[label]
        x, y, w, h, size = contours[label]
        if size >= 180:
            img = cv2.rectangle(imgray, (x, y), (x+w, y+h), (255, 255, 0), 1)
    
    结果:


    希望有帮助

    你的意思是你只想要你标记的4?或者你仅仅是因为你想要的其他的都是相似的,所以才标记了4?你能不能另外提供一张未标记的图像,以便用please进行测试?当白色圆点被涂成红色时,很难找到它们!是的,很抱歉把它们涂成红色,我意识到这会把任何试图帮助的人的输入图像弄得一团糟。但是使用阈值/轮廓检测,我能够完成我所需要的!任何方法只要找到它们,我就可以减少到我需要的数量。你是说你只想要你标记的4个吗?或者你仅仅是因为你想要的其他的都是相似的,所以才标记了4?你能不能另外提供一张未标记的图像,以便用please进行测试?当白色圆点被涂成红色时,很难找到它们!是的,很抱歉把它们涂成红色,我意识到这会把任何试图帮助的人的输入图像弄得一团糟。但是使用阈值/轮廓检测,我能够完成我所需要的!任何找到它们的方法,我都可以减少到我需要的数量。是的,这正是我所做的。谢谢你的回答。是的,这正是我所做的。谢谢你的回答。