hough.py 1.52 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
    def calcul_acc_cercles(img_s, rad_min=5, rad_max=100):
    #init acc :
    [c_max, r_max] = img_s.shape
    r_min=1
    delta_r = 1
    N_r =  int((r_max-r_min+delta_r)/delta_r)
    delta_c = 1
    c_min = 1
    N_c =  int((c_max-c_min+delta_c)/delta_c)
    delta_rad = 1
    N_rad =  int((rad_max-rad_min+delta_rad)/delta_rad)
    acc = np.zeros((N_rad,N_r,N_c))
    print("Taille de l'accumulateur" + str(acc.shape))
    x,y = np.nonzero(img_s)
    for i in range(len(x)):
        for r in range(r_min, r_max+1, delta_r):
            for c in range(c_min, c_max+1, delta_c):
                if (x[i],y[i]) != (r,c):
                    rad = np.sqrt((r-x[i])**2 + (c-y[i])**2)
                    if rad < rad_max and rad > rad_min:
                        i_id = int((r-r_min)/delta_r)
                        j_id = int((c-c_min)/delta_c)
                        k_id = int((rad-rad_min)/delta_rad)
                        acc[k_id,i_id,j_id] += 1 /rad
    return acc
def cherche_N_maxima_cercles(accumulateur, exclusion_xy,
exclusion_rayon, N):
    accu2 = np.copy(accumulateur)
    [rad_max0, c_max0, r_max0] = accumulateur.shape
    liste_max = []
    for cercle in range(N):
        [rayon, w_0, h_0] = np.unravel_index(np.argmax(accu2),accu2.shape)
        rayon += 5
        w_0 += 1
        h_0 += 1
        accu2[rayon - exclusion_rayon : rayon + exclusion_rayon,
              w_0 -exclusion_xy : w_0 + exclusion_xy,
              h_0 - exclusion_xy : h_0 + exclusion_xy] =0
        liste_max.append([rayon, w_0, h_0])
    return liste_max