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
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)figA.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)figB.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)figC.pdf
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)figD.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)figE.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)figF.pdf