Sobel Operator
The Sobel operator is an algorithm for edge detection in images. Edge detection for those who are not familiar with the term, is an image processing technique to discover the boundaries between regions in an image. It’s an important part of detecting features and objects in an image. Simply put, edge detection algorithms help us to determine and separate objects from background, in an image.
The Sobel operator does this in a rather clever way. An image gradient is a change in intensity (or color) of an image. An edge in an image occurs when the gradient is greatest and the Sobel operator makes use of this fact to find the edges in an image. The Sobel operator calculates the approximate image gradient of each pixel by convolving the image with a pair of 3×3 filters. These filters estimate the gradients in the horizontal (x) and vertical (y) directions and the magnitude of the gradient is simply the sum of these 2 gradients.
The magnitude of the gradient, which is what we use, is calculated using:
Example (OpenCV)
#include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "iostream" using namespace cv; using namespace std; int main( ) { IplImage* newImg; /* load an image named "desert.jpg", 1 means this is a color image */ newImg = cvLoadImage("Desert.jpg",1); Mat src1; src1 = cvarrToMat(newImg); namedWindow( "Original image", CV_WINDOW_AUTOSIZE ); imshow( "Original image", src1 ); Mat grey; cvtColor(src1, grey, CV_BGR2GRAY); Mat sobelx; Sobel(grey, sobelx, CV_32F, 1, 0); double minVal, maxVal; minMaxLoc(sobelx, &minVal, &maxVal); //find minimum and maximum intensities cout << "minVal : " << minVal << endl << "maxVal : " << maxVal << endl; Mat draw; sobelx.convertTo(draw, CV_8U, 255.0/(maxVal - minVal), -minVal * 255.0/(maxVal - minVal)); namedWindow("image", CV_WINDOW_AUTOSIZE); imshow("image", draw); waitKey(0); return 0; }