· Hakan Çelik · OpenCV / Image Processing · 3 dk okuma

Canny Edge Detection

The concept of Canny edge detection. OpenCV function for this operation: cv2.Canny()

Canny Edge Detection

Goals

  • The concept of Canny edge detection
  • OpenCV function for this operation: cv2.Canny()

Theory

The Canny edge detection algorithm is a popular edge detection algorithm. It was developed by John F. Canny in 1986. It is a multi-stage algorithm and we will learn all of it.

Noise Reduction

Since edge detection is sensitive to noise in the image, the first step is to remove the noise in the image with a 5x5 Gaussian filter. We have already seen this in earlier sections.

Finding Intensity Gradient of the Image

The smoothed image is then filtered with a Sobel kernel in both horizontal direction and vertical direction to get the first derivative in horizontal and vertical directions. From these two images, we can find edge gradient and direction for each pixel as follows:

canny-kenar-alglama

Gradient direction ( Gradient direction ) is always perpendicular to edges. It is rounded to one of four angles representing vertical, horizontal and two diagonal directions.

Non-maximum Suppression

After getting gradient magnitude and direction, a full scan of image is done to remove any unwanted pixels which may not constitute the edge. For this, at every pixel, pixel is checked if it is a local maximum in its neighborhood in the direction of gradient. Check the image below:

Point A is on the edge (in vertical direction). Gradient direction is normal to the edge. Points B and C are in gradient directions. So point A is checked with points B and C to see if it forms a local maximum. If so, it is considered for next stage; otherwise, it is suppressed (put to zero). In short the result you get is a binary image with “thin edges”.

Hysteresis Thresholding

This stage decides which are all edges are really edges and which are not. For this, we need two threshold values, minVal ( minimum value ) and maxVal ( maximum value ). Any edges with intensity gradient more than maxVal ( maximum value ) are sure to be edges and those below minVal ( minimum value ) are sure to be non-edges, so discarded. Those who lie between these two thresholds are classified based on their connectivity. If they are connected to “sure-edge” pixels, they are considered to be part of edges. Otherwise, they are also discarded. See the image below.

Edge A is above the maxVal, so considered as “sure-edge”. Although Edge C is below maxVal, it is connected to Edge A, so considered as valid edge and we get that full curve. But Edge B, although it is above minVal and is in same region as that of Edge C, it is not connected to any “sure-edge”, so it is discarded. Therefore it is very important that we select minVal and maxVal accordingly to get the correct result.

This stage also removes small pixel noise on the assumption that edges are long lines.

So what we finally get are strong edges in the image.

Canny Edge Detection in OpenCV

OpenCV does all the above steps described in the theory section with the cv2.Canny() function. Now we will see how to use this function.

  • Our first parameter is the input argument, i.e. our image.
  • The second and
  • third parameters are the minimum and maximum values respectively.
  • The fourth argument is aperture_size. It is the size of Sobel kernel used for finding image gradients. By default it is 3.
  • The last argument is L2gradient which specifies the equation for finding gradient magnitude. If True, it uses the more accurate equation mentioned above, otherwise this function is used:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('messi5.jpg',0)
edges = cv2.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()

Result;

Back to Blog

Related Posts

View All Posts »
Image Thresholding

Image Thresholding

OpenCV · 5 dk

In this article we will learn simple thresholding, adaptive thresholding, and Otsu's thresholding, and we will learn these functions: cv2.threshold, cv2.adaptiveThreshold

Trackbar as a Color Palette

Trackbar as a Color Palette

OpenCV · 2 dk

We will learn how to bind a Trackbar to OpenCV windows. We will learn these functions: cv2.getTrackbarPos(), cv2.createTrackbar(), etc.

Changing Color Spaces

Changing Color Spaces

OpenCV · 3 dk

In this article, we will learn how to convert images from one color space to another, such as BGR to Gray, BGR to HSV, etc. In addition, we will create an application that allows extracting a colored object in a video. We will learn these fun