Я новичок в OpenCV и хочу выровнять изображение с искаженным текстом. Сначала я читаю изображение в GrayScale и бинаризирую его, затем пытаюсь сделать этот:
import cv2
import numpy as np
img = cv2.imread('m20.jpg',0)
ret,byw = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
_, contours, hierarchy = cv2.findContours(byw.copy(), cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cnt = contours[0]
draw = cv2.cvtColor(byw, cv2.COLOR_GRAY2BGR)
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(draw, [box], 0, (0, 255, 0), 2)
Но это не работает, потому что findContours () ожидает получить изображение с формой тела.
Другой способ, которым я пытаюсь это перевести этот код с ++:
// Read image
Mat3b img = imread("path_to_image");
// Binarize image. Text is white, background is black
Mat1b bin;
cvtColor(img, bin, COLOR_BGR2GRAY);
bin = bin < 200;
// Find all white pixels
vector<Point> pts;
findNonZero(bin, pts);
// Get rotated rect of white pixels
RotatedRect box = minAreaRect(pts);
if (box.size.width > box.size.height)
{
swap(box.size.width, box.size.height);
box.angle += 90.f;
}
Point2f vertices[4];
box.points(vertices);
for (int i = 0; i < 4; ++i)
{
line(img, vertices[i], vertices[(i + 1) % 4], Scalar(0, 255, 0));
}
// Rotate the image according to the found angle
Mat1b rotated;
Mat M = getRotationMatrix2D(box.center, box.angle, 1.0);
warpAffine(bin, rotated, M, bin.size());
И у меня есть это:
draw = cv2.cvtColor(byw, cv2.COLOR_GRAY2BGR)
data = np.array(byw)
subzero = np.nonzero(data)
subuno = np.reshape(subzero,(17345,2)) # this is because cv2.minAreaRect() receives a Nx2 numpy
rect = cv2.minAreaRect(subuno)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(draw,[box],0,(0,255,0),2)
Но опять же результат не ожидаемый, прямоугольник не очень хорошо расположен.
Также происходит со мной, что может попытаться сделать for
как в C ++, но я не знаю, как получить вершины из
box = cv2.boxPoints(rect)
, Пожалуйста помоги!
Может быть, вы можете проверить это: http://www.pyimagesearch.com/2014/08/25/4-point-opencv-getperspective-transform-example/
В этой ссылке автор выравнивает или преобразует весь документ (и, следовательно, также содержащийся в нем текст), однако это зависит от нахождения краев документа на основе контуров, найденных на изображении.
Он пойдет дальше в следующем уроке: http://www.pyimagesearch.com/2014/09/01/build-kick-ass-mobile-document-scanner-just-5-minutes/
Его решения работают, потому что он может настроить весь документ на основе обнаруженного положения, ориентации и асимметрии документов. Регулировка положения документа в целом в действительности корректирует все, что находится внутри документа, включая текст.
Тем не менее, я полагаю, что вы спрашиваете, вы хотите, чтобы текст даже без обнаружение любых краев и контуров документа. Если это так, то я полагаю, что вам нужно будет предоставить другую основу или стандарт, на котором будет основываться текст (например, определить наличие букв на изображении, а затем определить, насколько искажены буквы на основе вашего стандарта. , затем скорректируйте буквы), что может быть нетривиальным упражнением.
Других решений пока нет …