【问题标题】:Scale space blob detection using opencv使用opencv缩放空间斑点检测
【发布时间】:2013-02-05 14:14:18
【问题描述】:

我是图像处理和计算机视觉方面的新手,我想使用具有不同尺度空间的高斯拉普拉斯算子来检测图像中的斑点。以下链接详细说明。 http://www.cs.utah.edu/~jfishbau/advimproc/project1/ http://www.cs.utah.edu/~manasi/coursework/cs7960/p1/project1.html 到目前为止,通过使用 opencv2,我已经设法获取图像,应用具有各种内核的高斯滤波器并应用拉普拉斯滤波器。我乘以 sigma 对整个图像进行平方以放大信号(参见链接中的描述),然后我应用阈值。下一步是检测局部最大值和最小值,这样我就可以获得斑点中心并能够绘制圆圈,但我不知道该怎么做以及我到目前为止所做的图像处理是否正确。这是我的代码:

int main(){

    image1 = imread("butterfly.jpg",0);

    drawing1 = imread("butterfly.jpg");

    blobDetect(image1,drawing1);
waitKey();
    return 0;
}

void blobDetect(Mat image, Mat drawing){

    int ksize = 1;
    int n =1;

    Mat result[10];
    for(int i=0; i<10; i++){
    cv::GaussianBlur(image,result[i],cv::Size(ksize,ksize),ksize/3,0);
    n+=1;
    ksize = 2*n-1;
    }

    ksize = 1;
    n =1;
    for(int i=0; i<10; i++){
    cv::Laplacian(result[i],result[i],CV_8U,ksize,1,0);
    n+=1;
        ksize = 2*n-1;
   }

   ksize = 1;
   int cols = image.cols;
   int rows = image.rows;
   for(int a=0; a<10; a++){
    for(int i=0; i<rows; i++){
        //uchar* data = result[a].ptr<uchar>(rows);
        for(int j=0; j<cols; j++){
            result[a].at<uchar>(i,j) *= (ksize/3)*(ksize/3);                
        }   
    }
    ksize++;
    ksize = 2*ksize-1;
}
    

for(int i=0; i<10; i++){
    cv::threshold(result[i], result[i], 100, 255, 0);
}
    
}

这是预期的结果

谢谢

【问题讨论】:

  • 首先我觉得有必要澄清一点:你没有使用“不同的尺度空间”,你使用的是一个单一的空间尺度,在这个问题中是高斯(或线性)尺度空间.从它并基于林德伯格的作品,这些链接建议结合使用拉普拉斯滤波器来尝试跨尺度查找斑点。从那里存在许多可能性,其中之一是将存在于两个“相邻”尺度中的区域最大值视为一个斑点,因此可以从中得出一个圆。那么,您的问题与尺度空间或区域最大值/最小值有关吗?

标签: visual-c++ opencv computer-vision


【解决方案1】:

检测轮廓后,可以使用

minEnclosingCircle()

最好看看这个教程:

http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.html

【讨论】:

  • 我不能使用容易的轮廓,我必须遵循提供的链接中描述的某种算法。
  • 当您计算/查找/获取 blob 的点时,您不必创建或使用轮廓,minEnclosureCircle() 适用于点,而不适用于轮廓,因此它适用于您。 docs.opencv.org/modules/imgproc/doc/… 基本上你给函数“点”,它给你返回最小包围圆的中心和半径,然后你可以很容易地画圆。
  • 基本上我的问题是我不知道如何在处理后的图像中找到作为斑点中心的点,并且我不确定我的图像处理(高斯拉普拉斯算子)是否正确.
  • minEnclosingCircle 和链接的教程都与问题无关。这些图像中的区域最小值大多是单点(即一个像素),因此使用前一个函数没有意义。在这些函数中,唯一相关的是circle——它只不过是在给定的中心绘制一个半径为某个圆的圆。但要解决的问题不是画圆,而是计算区域最大值/最小值。
  • 他想找到圆的中心点,所以 minEnclosureCircle 也与教程相关。所以画一个圆圈,也许你可以弥补它的中心点。这是一件简单的事情,只要合乎逻辑,不要复杂。
猜你喜欢
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多