# Canny Edge Detection- Non Maximum Surpression Implementation

I am trying to implement the Canny edge detection algorithm from scratch with the help of OpenCV. I am facing a problem implementing the Non-Maximum Suppression step which helps to thin the edges.

My logic is to first compute the intensity gradient vector, then group it in either 0,45,90,135 degrees direction and then try to find local maxima. The method to find this local maxima is by making sure that current pixel is greater than succeeding and preceeding pixel in same direction. If not, I assign value of zero to this pixel. Using this logic, I'm still not able to thin the edges. I feel the error is when I'm computing the intensity gradient vector for each pixel.

Here is my code-

#include <iostream>
#include <bits/stdc++.h>
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <opencv2/objdetect/objdetect.hpp>
#include <math.h>

using namespace cv;
using namespace std;

int main()
{

// Displaying image
//imshow("Original Image",img);
//waitKey(0);

// Converting to grayscale
Mat img_gray,image_gray;
cvtColor(img,image_gray,CV_RGB2GRAY);
GaussianBlur( image_gray, img_gray, Size(15,15), 3, 3);

// Displaying grayscale image
imshow("Original Image",img_gray);
waitKey(0);

int cols = img_gray.cols;
int rows = img_gray.rows;

// Creating sobel operator in x direction
int sobel_x[3][3] = {-1,0,1,-2,0,2,-1,0,1};
// Creating sobel operator in y direction
int sobel_y[3][3] = {1,2,1,0,0,0,-1,-2,-1};

// Handle border issues
Mat _src;

// Create output matrix

// Conrrelation loop in x direction

// Iterate on image
{
{
int s = 0;

// Iterate on kernel
{
{
s += _src.at<uchar>(r + i, c + j) * sobel_x[i + radius][j + radius];
}
}

/*if(s>200)
else
*/
}
}

// Conrrelation loop in y direction

// Iterate on image
{
{
int s = 0;

// Iterate on kernel
{
{
s += _src.at<uchar>(r + i, c + j) * sobel_y[i + radius][j + radius];
}
}

/*if(s>200)
else
*/
}
}

///cout<<endl<<"max:"<<max;
//cout<<img_gray.rows;
//cout<<endl<<_src.rows;

for(int i=0; i ...
edit retag close merge delete

Sort by ยป oldest newest most voted

Maybe the issue is with how you're calculating the Sobel gradients. Try this .

cv::Mat Gx, Gy;
cv::Sobel(img, Gx, CV_64F, 1, 0, ksize);
cv::Sobel(img, Gy, CV_64F, 0, 1, ksize);


where ksize is the size of the Sobel kernel. (in your case, ksize = 3)

more

Yes, it actually gave me much thinner edges. Do you have any idea why my sobel gradients isn't coming out properly? I changed the value of my sobel operator in y direction to int sobel_y[3][3] = {-1,-2,-1,0,0,0,1,2,1}; . I thought that was the mistake but barely any change is there.

( 2016-11-03 19:49:17 -0600 )edit

Official site

GitHub

Wiki

Documentation