Исправление перекосов изображений с помощью OpenCV: подробное руководство

При обработке изображений под устранением перекоса понимается процесс выпрямления перекошенного или наклонного изображения. Искаженные изображения могут негативно повлиять на различные задачи компьютерного зрения, такие как распознавание символов и обнаружение объектов. OpenCV, популярная библиотека компьютерного зрения, предоставляет несколько методов эффективного исправления искажений изображений. В этой статье мы рассмотрим несколько подходов к устранению перекоса изображений с помощью OpenCV, а также приведем примеры кода.

Метод 1: преобразование Хафа
Преобразование Хафа — популярный метод, используемый для обнаружения линий на изображении. Используя это преобразование, мы можем оценить угол перекоса изображения, а затем соответствующим образом повернуть его. Вот как можно исправить изображение с помощью преобразования Хафа:

import cv2
import numpy as np
def deskew_hough(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray, 50, 150, apertureSize=3)
    lines = cv2.HoughLines(edges, 1, np.pi/180, 200)
    if lines is not None:
        angles = []
        for line in lines:
            rho, theta = line[0]
            angles.append(theta)
        median_angle = np.median(angles)
        deskewed = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE if median_angle < np.pi/2 else cv2.ROTATE_90_COUNTERCLOCKWISE)
        return deskewed
# Usage
image = cv2.imread('skewed_image.png')
deskewed_image = deskew_hough(image)
cv2.imshow('Deskewed Image', deskewed_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

import cv2
import numpy as np
def deskew_moments(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    _, threshold = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
    contours, _ = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    if len(contours) > 0:
        contour = max(contours, key=cv2.contourArea)
        (x, y, w, h) = cv2.boundingRect(contour)
        angle = cv2.minAreaRect(contour)[-1]
        if angle < -45:
            angle = -(90 + angle)
        else:
            angle = -angle
        deskewed = cv2.warpAffine(image, cv2.getRotationMatrix2D((x + w//2, y + h//2), angle, 1.0), (image.shape[1], image.shape[0]))
        return deskewed
# Usage
image = cv2.imread('skewed_image.png')
deskewed_image = deskew_moments(image)
cv2.imshow('Deskewed Image', deskewed_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Метод 3: Преобразование Радона
Преобразование Радона — это метод, позволяющий определить угол и величину искажения изображения. Применив преобразование Радона и определив пиковый угол, мы можем эффективно исправить изображение.

import cv2
import numpy as np
from scipy.ndimage import rotate
from skimage.transform import radon
def deskew_radon(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray, 50, 150, apertureSize=3)
    theta = np.linspace(-90.0, 90.0, max(image.shape), endpoint=False)
    sinogram = radon(edges, theta=theta, circle=True)
    rotation_angle = (np.argmax(np.sum(sinogram, axis=0)) - len(theta) // 2) * (180.0 / len(theta))
    deskewed = rotate(image, rotation_angle, reshape=False)
    return deskewed
# Usage
image = cv2.imread('skewed_image.png')
deskewed_image = deskew_radon(image)
cv2.imshow('Deskewed Image', deskewed_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

В этой статье мы рассмотрели три различных метода исправления перекоса изображений с помощью OpenCV. Преобразование Хафа, основанный на моментах подход, и преобразование Радона предлагают эффективные способы исправления перекосов изображений. Применяя эти методы, мы можем повысить точность различных задач компьютерного зрения. Каждый метод имеет свои преимущества и может работать лучше в разных сценариях. Экспериментируя с этими методами, вы сможете добиться оптимальных результатов для вашего конкретного случая использования.

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

Не забудьте предварительно обработать изображения перед применением этих методов исправления перекоса. Это может включать преобразование их в оттенки серого, применение фильтров шумоподавления и определение порога для улучшения качества входного изображения.