Table des matières Python

Extraction de lignes par transformation de Hough

1. Introduction

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.

2. Transformation de Hough

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)
            
figAfigA.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)
            
figBfigB.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)
            
figCfigC.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.

Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.