При обработке изображений под устранением перекоса понимается процесс выпрямления перекошенного или наклонного изображения. Искаженные изображения могут негативно повлиять на различные задачи компьютерного зрения, такие как распознавание символов и обнаружение объектов. 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), усовершенствовать алгоритмы обнаружения объектов и обеспечить более надежное извлечение признаков в приложениях компьютерного зрения.
Не забудьте предварительно обработать изображения перед применением этих методов исправления перекоса. Это может включать преобразование их в оттенки серого, применение фильтров шумоподавления и определение порога для улучшения качества входного изображения.