La transformation de Hough permet d'extraire des lignes droites d'une image binaire. L'algorithme est détaillé dans Extraction de lignes par transformation de Hough.
Cette page montre comment effectuer la transformation de Hough avec OpenCV.
import cv2 import cv2.cv as cv from matplotlib.pyplot import * import numpy import math
img1 = cv2.imread("../../../../simul/image/bords-kapla.jpg") blue,green,red = cv2.split(img1) figure(figsize=(8,6)) imshow(red,cmap=cm.gray)figA.pdf
La fonction HoughLines effectue la transformation de Hough. rho et theta sont les résolutions de l'accumulateur respectivement en pixel et en radian. threshold est le seuil de détection des maxima dans l'accumulateur.
lines = cv2.HoughLines(red,rho=1,theta=numpy.pi/180,threshold=130)
Le résultat est renvoyé sous forme d'un tableau dont chaque ligne comporte une paire (ρ,θ). Nous allons tracer les lignes obtenues sur l'image :
img2 = img1.copy() for rho,theta in lines[0]: a = math.cos(theta) b = math.sin(theta) x0 = a*rho y0 = b*rho x1 = int(x0 + 1000*(-b)) y1 = int(y0 + 1000*(a)) x2 = int(x0 - 1000*(-b)) y2 = int(y0 - 1000*(a)) cv2.line(img2,(x1,y1),(x2,y2),(0,0,255),2) figure(figsize=(8,6)) imshow(img2)figB.pdf
Avec ce seuil (130), seuls les grands côtés des rectangles sont détectés. On remarque que plusieurs droites sont obtenues pour le rectangle le plus incliné. Pour le rectangle vertical, la détection est beaucoup plus fine.
Augmentons le seuil :
lines = cv2.HoughLines(red,rho=1,theta=numpy.pi/180,threshold=170) img2 = img1.copy() for rho,theta in lines[0]: a = math.cos(theta) b = math.sin(theta) x0 = a*rho y0 = b*rho x1 = int(x0 + 1000*(-b)) y1 = int(y0 + 1000*(a)) x2 = int(x0 - 1000*(-b)) y2 = int(y0 - 1000*(a)) cv2.line(img2,(x1,y1),(x2,y2),(0,0,255),2) figure(figsize=(8,6)) imshow(img2)figC.pdf
Le nombre de droites obtenues pour les deux rectangles inclinés est considérablement réduit. En revanche, le rectangle vertical n'est plus détecté. Cela montre que le seuil de détection optimal doit être ajusté en fonction de l'orientation des lignes.