Table des matières Python

Détection des bords

1. Introduction

Cette page montre comment effectuer une détection de bords avec OpenCV par une dérivation du premier ordre. L'algorithme de détection de bords est expliqué dans Détection des bords.

import cv2
import cv2.cv as cv
from matplotlib.pyplot import *
import numpy
import math
            

2. Dérivation de Sobel

Lecture de l'image et extraction de la couche rouge :

img1 = cv2.imread("../../../../simul/image/objets.png")
blue,green,red = cv2.split(img1)
figure(figsize=(4,4))
imshow(red,cmap=cm.gray)
            
figAfigA.pdf

L'opérateur de Sobel est un filtre linéaire qui combine une différentiation sur un axe avec un lissage gaussien sur l'autre axe. Il sert donc à évaluer une dérivée sur un axe en limitant les effets du bruit.

Voici par exemple le calcul de la dérivée par rapport à x et de la dérivée par rapport à y:

derivX = cv2.Sobel(red,ddepth=-1,dx=1,dy=0)
derivY = cv2.Sobel(red,ddepth=-1,dx=0,dy=1)
figure(figsize=(8,4))
f,(p1,p2)=subplots(ncols=2)
p1.imshow(derivX,cmap=cm.gray)
p2.imshow(derivY,cmap=cm.gray)
             
figBfigB.pdf

Les bords sont obtenus en calculant la norme du gradient :

gradient = derivX+derivY*1j
G = numpy.absolute(gradient)
figure(figsize=(4,4))
imshow(G,cmap=cm.gray)
             
figCfigC.pdf

3. Algorithme de Canny

L'algorithme de Canny consiste à calculer le gradient, à effectuer une suppression des non-maximum et à appliquer un seuillage par hystérésis. Le seuil bas et le seuil haut doivent être ajustés en fonction de l'image.

bords = cv2.Canny(red,threshold1=100.0,threshold2=150.0)
figure(figsize=(4,4))
imshow(bords,cmap=cm.gray)   
             
figDfigD.pdf

Autre exemple :

img1 = cv2.imread("../../../../simul/image/kapla.jpg")
img2 = cv2.cvtColor(img1,cv2.COLOR_BGR2HSV)
hue,sat,value = cv2.split(img2)
figure(figsize=(8,6))
imshow(value,cmap=cm.gray)
             
figEfigE.pdf
bords = cv2.Canny(value,threshold1=100.0,threshold2=150.0)
cv2.imwrite("../../../../simul/image/bords-kapla.jpg",bords)
figure(figsize=(8,6))
imshow(bords,cmap=cm.gray)
             
figFfigF.pdf
Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.