Quantcast
Channel: OpenCV Q&A Forum - Latest question feed
Viewing all articles
Browse latest Browse all 19555

Sobel edge detection Implementation

$
0
0
I am trying to implement sobel edge detection from scratch but my output can't seem to match with OpenCV's sobel function. I performed correlation on the image with the sobel operator in both x and y directions and then computed gradient magnitude as square root of sum of squares of magnitudes in both x & y direction. I believe the problem is how I assign the threshold for edge detection. Images- 1.Original Image- ![image description](/upfiles/14784053197976539.png) 2.My implementation of Sobel Edge Detection - ![image description](/upfiles/14784053477222739.png) 3.Opencv Sobel edge function output - ![image description](/upfiles/14784053791638973.png) Code- #include #include #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/opencv.hpp" #include "opencv2/imgproc/imgproc.hpp" #include #include using namespace cv; using namespace std; int main() { // Reading image Mat img = imread("1.jpg"); // Blurring and Converting to grayscale Mat img_gray,image_blur; GaussianBlur( img, image_blur, Size(5,5), 3, 3); cvtColor(image_blur,img_gray,CV_RGB2GRAY); 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}; int radius = 1; // Handle border issues Mat _src; copyMakeBorder(img_gray, _src, radius, radius, radius, radius, BORDER_REFLECT101); // Create output matrix Mat gradient_x = img_gray.clone(); Mat gradient_y = img_gray.clone(); Mat gradient_f = img_gray.clone(); int max=0; // Correlation loop in x direction // Iterate on image for (int r = radius; r < _src.rows - radius; ++r) { for (int c = radius; c < _src.cols - radius; ++c) { int s = 0; // Iterate on kernel for (int i = -radius; i <= radius; ++i) { for (int j = -radius; j <= radius; ++j) { s += _src.at(r + i, c + j) * sobel_x[i + radius][j + radius]; } } gradient_x.at(r - radius, c - radius) = s/30; /*if(s>200) gradient.at(r - radius, c - radius) = 255; else gradient.at(r - radius, c - radius) = 0; */ } } // Conrrelation loop in y direction // Iterate on image for (int r = radius; r < _src.rows - radius; ++r) { for (int c = radius; c < _src.cols - radius; ++c) { int s = 0; // Iterate on kernel for (int i = -radius; i <= radius; ++i) { for (int j = -radius; j <= radius; ++j) { s += _src.at(r + i, c + j) * sobel_y[i + radius][j + radius]; } } gradient_y.at(r - radius, c - radius) = s/30; /*if(s>200) gradient.at(r - radius, c - radius) = 255; else gradient.at(r - radius, c - radius) = 0; */ } } //Calculating gradient magnitude for(int i=0; i(i,j) = sqrt( pow(gradient_x.at(i,j),2) + pow(gradient_y.at(i,j),2) ); if(gradient_f.at(i,j) >240) gradient_f.at(i,j) = 100; else gradient_f.at(i,j) = 0; } } imshow("grad magnitude",gradient_f); waitKey(0); cv::Mat Gx, Gy; int ksize=3; Mat abs_grad_x, abs_grad_y; cv::Sobel(img_gray, Gx, CV_8U, 1, 0, ksize); convertScaleAbs( Gx, abs_grad_x ); cv::Sobel(img_gray, Gy, CV_8U, 0, 1, ksize); convertScaleAbs( Gy, abs_grad_y ); Mat grad; addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad ); imshow("Sobel Image",grad); waitKey(0); return 0; }

Viewing all articles
Browse latest Browse all 19555

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>