Улучшение выравнивания изображения с помощью Python и OpenCV

Код, который я создал для обнаружения и исправления перекоса, дает противоречивые результаты. В настоящее время я работаю над проектом, в котором используется извлечение текста OCR на изображениях (через Python и OpenCV), поэтому удаление перекоса является ключевым, если требуются точные результаты. Мой код использует cv2.minAreaRect для обнаружения перекоса.

Изображения, которые я использую, все идентичны (и будут в будущем), поэтому я не уверен, что вызывает эти несоответствия. Я включил два набора изображений до и после (включая значение перекоса из cv2.minAreaRect), где я применил свой код, один показывает успешное удаление перекоса и показывает, что перекос не был удален (похоже, он добавил еще больше перекоса).

Изображение 1 до (-87.88721466064453) Изображение 1 до

Изображение 1 после (успешное выравнивание) Изображение 1 после

Изображение 2 до (-5.766754150390625) Изображение 2 до

Изображение 2 после (неудачное выравнивание) Изображение 2 после

Мой код ниже. Примечание. Я работал с гораздо большим количеством изображений, чем те, которые я включил сюда. Обнаруженный перекос до сих пор всегда находился в диапазонах [-10, 0) или (-90, -80], поэтому я попытался учесть это в своем коде.

    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    img_gray = cv2.bitwise_not(img_gray)
    
    thresh = cv2.threshold(img_gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
    coords = np.column_stack(np.where(thresh > 0))
    angle = cv2.minAreaRect(coords)[-1] 
      
    if (angle < 0 and angle >= -10):
        angle = -angle #this was intended to undo skew for values in [-10, 0) by simply rotating using the opposite sign
    else:
        angle = (90 + angle)/2  
     
    (h, w) = img.shape[:2]
    center = (w // 2, h // 2)
    
    M = cv2.getRotationMatrix2D(center, angle, 1.0)
    deskewed = cv2.warpAffine(img, M, (w, h), flags = cv2.INTER_CUBIC, borderMode = cv2.BORDER_REPLICATE)

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


person erik7970    schedule 30.07.2020    source источник
comment
См. pyimagesearch.com/2017/02/20/. text-skew-correction-opencv-python особенно то, как они исправляют угол minAreaRect   -  person fmw42    schedule 30.07.2020


Ответы (1)


Очень хороший инструмент для устранения перекоса текста можно найти в Python Wand, который использует ImageMagick. Он основан на преобразовании Радона.

Форма 1:

введите здесь описание изображения

Форма 2:

введите здесь описание изображения

from wand.image import Image
from wand.display import display


with Image(filename='form1.png') as img:
    img.deskew(0.4*img.quantum_range)
    img.save(filename='form1_deskew.png')
    display(img)

with Image(filename='form2.png') as img:
    img.deskew(0.4*img.quantum_range)
    img.save(filename='form2_deskew.png')
    display(img)

Форма 1 исправлена:

введите здесь описание изображения

Форма 2 исправлена:

введите здесь описание изображения

person fmw42    schedule 30.07.2020