1

私は画像処理とコンピューター ビジョンが初めてで、異なるスケール スペースでガウスのラプラシアンを使用して画像内のブロブを検出したいと考えています。以下のリンクで詳しく説明しています。 http://www.cs.utah.edu/~jfishbau/advimproc/project1/ http://www.cs.utah.edu/~manasi/coursework/cs7960/p1/project1.html これまで opencv2 を使用してなんとか画像を取得し、さまざまなカーネルでガウス フィルターを適用し、ラプラシアン フィルターを適用しました。信号を増幅するために画像全体をシグマ二乗で乗算し(リンクの説明を参照)、次にしきい値を適用します。次のステップは、ブロブの中心を取得して円を描くことができるように、局所的な最大値と最小値を検出することですが、その方法と、これまでに行った画像処理が正しいかどうかはわかりません。これが私のコードです:

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);
}
    
}

これは期待される結果です

これは期待される結果です

ありがとう

4

1 に答える 1

0

輪郭を検出した後、次を使用できます

minEnclosingCircle()

さらに良いのは、このチュートリアルをチェックすることです。

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

于 2013-02-20T14:44:20.580 に答える