Автоматическая коррекция перекоса с использованием opencv - PullRequest
0 голосов
/ 25 января 2019

Я хочу, чтобы был способ автоматически обнаруживать и корректировать перекос изображения чека, я пытался найти дисперсию между строками для различных углов поворота и выбрать угол, который имеет максимальную дисперсию.Для вычисления дисперсии я сделал следующее:

1. Для каждой строки я вычислил сумму значений пикселей и сохранил ее в списке.

2. Найдем дисперсию списка, используяnp.var(list)

    src = cv.imread(f_name, cv.IMREAD_GRAYSCALE)
    blurred=median = cv.medianBlur(src,9)
    ret,thresh2 = cv.threshold(src,127,255,cv.THRESH_BINARY_INV)
    height, width = thresh2.shape[:2]
    print(height,width)
    res=[-1,0]
    for angle in range(0,100,10):

        rotated_temp=deskew(thresh2,angle)
        cv.imshow('rotated_temp',rotated_temp)
        cv.waitKey(0)
        height,width=rotated_temp.shape[:2]
        li=[]
        for i in range(height):
            sum=0
            for j in range(width):
                sum+=rotated_temp[i][j]
            li.append(sum)
        curr_variance=np.var(li)
        print(curr_variance,angle)
        if(curr_variance>res[0]):
            res[0]=curr_variance
            res[1]=angle


    print(res)
    final_rot=deskew(src,res[1])
    cv.imshow('final_rot',final_rot)
    cv.waitKey(0)

Однако дисперсия для искаженного изображения становится больше, чем правильно выровненное изображение, есть ли способ исправить эту

  • дисперсиюдля изображения, выровненного по горизонтали (обязательно): 122449908.009789

  • дисперсия для изображения, выровненного по вертикали: 1840071444.404522

Vertical

Horizontal

Я пробовал использовать HoughLines. Однако, поскольку расстояние между текстом слишком мало, обнаруживаются вертикальные линии, следовательно, это также не удается

Любые модификации или другие подходы приветствуются

...