How to Find Image Gradients using the Scharr Operator in OpenCV Python?
If you’re working with images in OpenCV Python, you might need to find the image gradients at some point. Image gradients are important because they tell us how much the image intensity is changing at each pixel. This is useful for a variety of applications, such as edge detection, feature extraction, and object recognition.
In this article, we’ll show you how to find image gradients using the Scharr operator in OpenCV Python. The Scharr operator is a common way to compute the first-order image gradients. It’s similar to the Sobel operator, but it’s more accurate and less sensitive to noise.
Importing the Required Libraries
Before we get started, we need to import the required libraries. OpenCV is a popular computer vision library, while NumPy is a fundamental package for scientific computing in Python.
import cv2
import numpy as np
Loading the Image
Next, we need to load the image we want to work with. We can use the imread()
function of OpenCV to read in an image from a file. In this example, we’re using a test image called lena.png
.
img = cv2.imread('lena.png', cv2.IMREAD_GRAYSCALE)
Note that we’re loading the image in grayscale mode (cv2.IMREAD_GRAYSCALE
). This is because we’re only interested in the intensity values of the image, not the color information.
Finding the Gradient using Scharr Operator
Once we have the image loaded, we can find the gradient using the Scharr operator. OpenCV provides the Sobel()
function to calculate the image gradient. We can set the dx
and dy
parameters of this function to 1 and 0 respectively. This means we’re finding the gradient in the horizontal direction.
grad_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
Note that we’re using cv2.CV_64F
as the data type of the output gradient image. This is because the gradient values can be negative or positive, and we need a floating-point data type to store them accurately.
We’re also setting the ksize
parameter to 3. This means we’re using a 3×3 Scharr filter kernel to find the gradient.
Similarly, we can find the gradient in the vertical direction by setting dx
to 0 and dy
to 1.
grad_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
Finding the Magnitude and Direction of the Gradient
Now that we have the horizontal and vertical gradients, we can find the magnitude and direction of the overall gradient. The magnitude of the gradient tells us how much the intensity changes at each pixel, while the direction tells us the direction in which the intensity changes.
We can use the cartToPolar()
function of OpenCV to convert the horizontal and vertical gradients to polar coordinates. This gives us the magnitude and direction of the gradient.
mag, direction = cv2.cartToPolar(grad_x, grad_y, angleInDegrees=True)
Note that we’re setting angleInDegrees=True
to get the direction in degrees. If we set it to False
, we’d get the direction in radians.
Visualizing the Results
Finally, we can visualize the results by displaying the input image and the magnitude and direction of the gradient. We can use the imshow()
function of OpenCV to display the images.
cv2.imshow('Input Image', img)
cv2.imshow('Magnitude', mag)
cv2.imshow('Direction', direction)
cv2.waitKey(0)
Note that we’re using cv2.waitKey(0)
to wait for a key press before closing the image windows.
Full Code
Here’s the full code to find image gradients using the Scharr operator in OpenCV Python:
import cv2
import numpy as np
img = cv2.imread('lena.png', cv2.IMREAD_GRAYSCALE)
grad_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
grad_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
mag, direction = cv2.cartToPolar(grad_x, grad_y, angleInDegrees=True)
cv2.imshow('Input Image', img)
cv2.imshow('Magnitude', mag)
cv2.imshow('Direction', direction)
cv2.waitKey(0)
Conclusion
In this article, we’ve shown you how to find image gradients using the Scharr operator inOpenCV Python. We’ve explained the steps in detail, including loading the image, finding the gradient using the Scharr operator, and visualizing the results. We hope this article has been useful for you in understanding how to find image gradients in OpenCV Python.