Home » Tutorial: Edge Detection Using OpenCV in Python

Tutorial: Edge Detection Using OpenCV in Python

Java SE 11 Programmer I [1Z0-815] Practice Tests
1 Year Subscription
Spring Framework Basics Video Course
Java SE 11 Developer (Upgrade) [1Z0-817]
Oracle Java Certification
Java SE 11 Programmer II [1Z0-816] Practice Tests

Edge detection is an essential technique in image processing that highlights significant transitions in intensity. It is widely used in computer vision for object detection, image segmentation, and feature extraction.

OpenCV provides various methods for edge detection.

What You’ll Learn

1. Introduction to Edge Detection

Edges represent boundaries or contours in an image. Detecting edges involves identifying significant changes in pixel intensity. OpenCV provides multiple functions for edge detection, including Sobel, Laplacian, and Canny methods.

2. Sobel Edge Detection

The Sobel operator computes gradients in the x and y directions. This highlights vertical and horizontal edges.

Example: Sobel Edge Detection

import cv2
import numpy as np

# Load an image in grayscale
image = cv2.imread("input.jpg", cv2.IMREAD_GRAYSCALE)

# Apply Sobel edge detection
sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)  # Gradient in x direction
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)  # Gradient in y direction

# Convert gradients to absolute values and uint8 type
sobel_x = cv2.convertScaleAbs(sobel_x)
sobel_y = cv2.convertScaleAbs(sobel_y)

# Combine the gradients
sobel_combined = cv2.addWeighted(sobel_x, 0.5, sobel_y, 0.5, 0)

# Display results
cv2.imshow("Original", image)
cv2.imshow("Sobel X", sobel_x)
cv2.imshow("Sobel Y", sobel_y)
cv2.imshow("Sobel Combined", sobel_combined)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. Laplacian Edge Detection

The Laplacian operator calculates the second derivative, detecting edges by identifying regions of rapid intensity change.

Example: Laplacian Edge Detection

import cv2
import numpy as np

# Load an image in grayscale
image = cv2.imread("input.jpg", cv2.IMREAD_GRAYSCALE)

# Apply Laplacian edge detection
laplacian = cv2.Laplacian(image, cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)

# Display results
cv2.imshow("Original", image)
cv2.imshow("Laplacian", laplacian)
cv2.waitKey(0)
cv2.destroyAllWindows()

4. Canny Edge Detection

The Canny Edge Detector is a multi-stage algorithm that detects edges using gradient intensity and direction. It is one of the most robust edge detection methods available.

Example: Basic Canny Edge Detection

import cv2

# Load an image in grayscale
image = cv2.imread("input.jpg", cv2.IMREAD_GRAYSCALE)

# Apply Canny edge detection
edges = cv2.Canny(image, 100, 200)

# Display results
cv2.imshow("Original", image)
cv2.imshow("Canny Edges", edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

Parameters of cv2.Canny()

  • threshold1: Lower threshold for edge detection.
  • threshold2: Upper threshold for edge detection.

5. Combining Edge Detection Methods

You can combine different edge detection methods to enhance results.

Example: Combine Sobel and Canny

import cv2

# Load an image in grayscale
image = cv2.imread("input.jpg", cv2.IMREAD_GRAYSCALE)

# Apply Sobel edge detection
sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)
sobel_combined = cv2.addWeighted(cv2.convertScaleAbs(sobel_x), 0.5, cv2.convertScaleAbs(sobel_y), 0.5, 0)

# Apply Canny edge detection
canny_edges = cv2.Canny(image, 100, 200)

# Combine Sobel and Canny
combined_edges = cv2.addWeighted(sobel_combined, 0.5, canny_edges, 0.5, 0)

# Display results
cv2.imshow("Original", image)
cv2.imshow("Sobel Combined", sobel_combined)
cv2.imshow("Canny Edges", canny_edges)
cv2.imshow("Combined Edges", combined_edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

6. Practical Examples

6.1 Edge Detection on Video

import cv2

# Open video capture
video = cv2.VideoCapture(0)

while True:
    ret, frame = video.read()
    if not ret:
        break

    # Convert frame to grayscale
    gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Apply Canny edge detection
    edges = cv2.Canny(gray_frame, 100, 200)

    # Display results
    cv2.imshow("Original", frame)
    cv2.imshow("Edges", edges)

    if cv2.waitKey(1) & 0xFF == ord('q'):  # Quit on 'q'
        break

video.release()
cv2.destroyAllWindows()

6.2 Highlight Edges on the Original Image

import cv2

# Load an image
image = cv2.imread("input.jpg")

# Convert to grayscale and apply Canny edge detection
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray_image, 100, 200)

# Highlight edges on the original image
highlighted = cv2.addWeighted(image, 0.8, cv2.cvtColor(edges, cv2.COLOR_GRAY2BGR), 0.2, 0)

# Display results
cv2.imshow("Original", image)
cv2.imshow("Highlighted Edges", highlighted)
cv2.waitKey(0)
cv2.destroyAllWindows()

6.3 Detect and Count Contours from Edges

import cv2

# Load an image
image = cv2.imread("input.jpg")

# Convert to grayscale and detect edges
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray_image, 100, 200)

# Find contours
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# Draw contours on the original image
contour_image = image.copy()
cv2.drawContours(contour_image, contours, -1, (0, 255, 0), 2)

print(f"Number of contours found: {len(contours)}")

# Display results
cv2.imshow("Edges", edges)
cv2.imshow("Contours", contour_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

7. Summary

Key Methods

  • cv2.Sobel(): Detect edges using gradients in x and y directions.
  • cv2.Laplacian(): Detect edges using second derivatives.
  • cv2.Canny(): Robust edge detection using multi-stage algorithms.

Best Practices

  1. Preprocess images (e.g., convert to grayscale) for better results.
  2. Experiment with parameters to fine-tune edge detection for your application.
  3. Combine edge detection methods for improved accuracy.

By mastering these techniques, you’ll be equipped to analyze and process images effectively using edge detection with OpenCV

You may also like

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More