Я реализовал немного более простой алгоритм, чем мой другой ответ, но в Python с OpenCV на этот раз.
По сути, вместо того, чтобы брать среднее значение вертикальных столбцов пикселей, он суммирует пикселив столбцах и выбирает столбец, который является самым ярким.Если я покажу дополненное, повернутое изображение с другим изображением ниже, представляющим суммы столбцов, вы должны увидеть, как оно работает:
#!/usr/bin/env python3
import cv2
import numpy as np
# Load image as greyscale
im = cv2.imread('45.jpg',cv2.IMREAD_GRAYSCALE)
# Pad with border so it isn't cropped when rotated
bw=300
bordered = cv2.copyMakeBorder(im, top=bw, bottom=bw, left=bw, right=bw, borderType= cv2.BORDER_CONSTANT)
# Rotate -45 degrees
w, h = bordered.shape
M = cv2.getRotationMatrix2D((h/2,w/2),-45,1)
paddedrotated = cv2.warpAffine(bordered,M,(h,w))
# DEBUG cv2.imwrite('1.tif',paddedrotated)
# Sum the elements of each column and find column with most white pixels
colsum = np.sum(paddedrotated,axis=0,dtype=np.float)
col = np.argmax(colsum)
# DEBUG cv2.imwrite('2.tif',colsum)
# Fill with black except for the line we have located which we make white
paddedrotated[:,:] = 0
paddedrotated[:,col] = 255
# Rotate back to straight
w, h = paddedrotated.shape
M = cv2.getRotationMatrix2D((h/2,w/2),45,1)
straight = cv2.warpAffine(paddedrotated,M,(h,w))
# Remove padding and save to disk
straight = straight[bw:-bw,bw:-bw]
cv2.imwrite('result.png',straight)
Обратите внимание, что вам на самом деле не нужно поворачивать изображение обратно к прямой и обрезать его до исходного размера.Вы могли бы на самом деле остановиться после первой строки, которая говорит:
col = np.argmax(colsum)
и использовать некоторую элементарную тригонометрию, чтобы понять, что это означает в вашем исходном изображении.
Вот вывод:
Ключевые слова : обнаружение линии, обнаружение линии, поворот, отступ, граница, проекция, проект, изображение, обработка изображения,Python, OpenCV, аффинный, Hough