Читатели като вас помагат в подкрепа на MUO. Когато правите покупка чрез връзки на нашия сайт, ние може да спечелим комисионна за партньор. Прочетете още.

Може да искате да дигитализирате документ, за да спестите физическо пространство или да създадете резервно копие за запазване. Така или иначе, писането на програма, която може да конвертира снимки на вашите хартиени файлове в стандартен формат, е задача, с която Python се справя отлично.

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

Подготовка на вашата среда

За да следвате тази статия, трябва да сте запознати с основите на Python. Вие също трябва да имате разбиране за как да работите с библиотеката NumPy Python.

Отворете която и да е Python IDE и създайте два Python файла. Назовете единия main.py, а другия transform.py. След това изпълнете следната команда на терминала, за да инсталирате необходимите библиотеки.

pip инсталирайте OpenCV-Python imutils scikit-image NumPy

Ще използвате OpenCV-Python, за да вземете входното изображение и да извършите обработка на изображението. Imutils за преоразмеряване на входните и изходните изображения. scikit-image за прилагане на праг върху изображението. NumPy ще ви помогне да работите с масиви.

Изчакайте инсталацията да приключи и IDE да актуализира скелетите на проекта. След като актуализацията на скелетите приключи, вие сте готови да започнете да кодирате. Пълният изходен код е достъпен в a GitHub хранилище.

Импортиране на инсталираните библиотеки

Отворете файла main.py и импортирайте библиотеките, които сте инсталирали в средата. Това ще ви позволи да се обаждате и да използвате техните функции, когато е необходимо.

импортиране cv2
импортиране imutils
от skimage.филтри импортиране threshold_local
от трансформирам импортиране трансформация_на_гледна точка

Игнорирайте грешката, изхвърлена на perspective_transform. Той ще изчезне, когато приключите работата по файла transform.py.

Вземане и преоразмеряване на входа

Направете ясно изображение на документа, който искате да сканирате. Уверете се, че четирите ъгъла на документа и неговото съдържание са видими. Копирайте изображението в същата папка, в която съхранявате програмните файлове.

Предайте пътя на входното изображение към OpenCV. Направете копие на оригиналното изображение, тъй като ще ви трябва по време на трансформацията на перспектива. Разделете височината на оригиналното изображение на височината, на която искате да го преоразмерите. Това ще запази съотношението на страните. Накрая изведете преоразмереното изображение.

# Преминаване на пътя на изображението
original_img = cv2.imread("образец.jpg")
копие = original_img.copy()

# Преоразмерената височина в стотици
съотношение = original_img.shape[0] / 500.0
img_resize = imutils.resize (оригинално_img, височина=500)

# Показване на изход
cv2.imshow(„Преоразмерено изображение“, img_resize)

# Изчакване потребителят да натисне произволен клавиш
cv2.waitKey(0)

Резултатът от горния код е както следва:

Вече преоразмерихте височината на оригиналното изображение до 500 пиксела.

Преобразуване на преоразмереното изображение в скала на сивото

Преобразувайте преоразмереното RGB изображение в нива на сивото. Повечето библиотеки за обработка на изображения работят само с изображения в сива скала, тъй като те са по-лесни за обработка.

сиво_изображение = cv2.cvtColor (img_resize, cv2.COLOR_BGR2GRAY)
cv2.imshow(„Сиво изображение“, сиво_изображение)
cv2.waitKey(0)

Забележете разликата между оригиналното изображение и сивото.

Цветната маса се превърна в черно-бяла.

Прилагане на детектор на ръбове

Приложете филтър за размазване по Гаус върху сивото изображение, за да премахнете шума. След това извикайте функцията Canny на OpenCV, за да откриете наличните ръбове в изображението.

замъглено_изображение = cv2.GaussianBlur (сиво_изображение, (5, 5), 0)
edged_img = cv2.Canny (замъглено_изображение, 75, 200)
cv2.imshow(„Ръбове на изображението“, edged_img)
cv2.waitKey(0)

Ръбовете се виждат на изхода.

Ръбовете, с които ще работите, са тези на документа.

Намиране на най-големия контур

Открийте контурите, присъстващи в изображението с ръбове. Сортирайте ги в низходящ ред, като запазите само петте най-големи контура. Приближете най-големия контур с четири страни, като преминете през сортираните контури.

cnts, _ = cv2.findContours (edged_img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts = сортирани (cnts, key=cv2.contourArea, reverse=Вярно)[:5]

за ° С в cnts:
peri = cv2.arcLength (c, Вярно)
приблизително = cv2.approxPolyDP(c, 0.02 * пери, Вярно)

ако len (приблизително) == 4:
doc = прибл
прекъсвам

Контурът с четири страни вероятно ще съдържа документа.

Заобикаляне на четирите ъгъла на контура на документа

Оградете ъглите на открития контур на документа. Това ще ви помогне да определите дали вашата програма е успяла да открие документа в изображението.

p = []

за д в документ:
точка_на_кортеж = кортеж (d[0])
cv2.circle (img_resize, tuple_point, 3, (0, 0, 255), 4)
p.append (кортежна_точка)

cv2.imshow(„Ъглови точки с кръгове“, img_resize)
cv2.waitKey(0)

Приложете кръгче върху преоразмереното RGB изображение.

След като сте открили документа, сега трябва да извлечете документа от изображението.

Използване на Warp Perspective за получаване на желаното изображение

Деформираната перспектива е техника за компютърно зрение за трансформиране на изображение за коригиране на изкривяванията. Той трансформира изображение в различна равнина, което ви позволява да видите изображението от различен ъгъл.

изкривено_изображение = perspective_transform (копиране, doc.reshape(4, 2) * съотношение)
изкривено_изображение = cv2.cvtColor (изкривено_изображение, cv2.COLOR_BGR2GRAY)
cv2.imshow(„Изкривено изображение“, imutils.resize (изкривено_изображение, височина=650))
cv2.waitKey(0)

За да получите изкривено изображение, трябва създайте прост модул който ще извърши трансформацията на перспективата.

Модул за трансформация

Модулът ще подреди точките на ъглите на документа. Той също така ще трансформира изображението на документа в различна равнина и ще промени ъгъла на камерата към снимка отгоре.

Отворете файла transform.py, който сте създали по-рано. Импортирайте OpenCV и NumPy библиотеки.

импортиране numpy като np
импортиране cv2

Този модул ще съдържа две функции. Създайте функция, която ще подрежда координатите на ъгловите точки на документа. Първата координата ще бъде тази на горния ляв ъгъл, втората ще бъде тази на горния десен ъгъл, третата ще бъде в долния десен ъгъл, а четвъртата координата ще бъде в долния ляв ъгъл ъгъл.

дефпоръчки_точки(точки):
# инициализиране на списъка с координати за подреждане
rect = np.zeros((4, 2), dtype = "float32")

s = pts.sum (ос = 1)

# горната лява точка ще има най-малката сума
прав [0] = точки [np.argmin (s)]

# долната дясна точка ще има най-голямата сума
прав [2] = точки [np.argmax (s)]

изчисляване на разликата между точките,
горната дясна точка ще има най-малката разлика,
докато долният ляв ще има най-голямата разлика
diff = np.diff (точки, ос = 1)
прав [1] = точки [np.argmin (разл.)]
прав [3] = точки [np.argmax (разл.)]

# връща подредени координати
връщане прав

Създайте втора функция, която ще изчисли ъгловите координати на новото изображение и ще получи снимка отгоре. След това ще изчисли матрицата за трансформация на перспектива и ще върне изкривеното изображение.

дефтрансформация_на_гледна точка(изображение, точки):
# разопаковайте поръчаните координати поотделно
rect = order_points (точки)
(tl, tr, br, bl) = прав

изчислете ширината на новото изображение, което ще бъде
максимално разстояние между долния десен ъгъл и долу-ляво
x-координати или горе вдясно и горе вляво x-координати
widthA = np.sqrt(((br[0] - бл[0]) ** 2) + ((br[1] - бл[1]) ** 2))
widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
maxWidth = max (int (widthA), int (widthB))

изчислете височината на новото изображение, което ще бъде
максимално разстояние между горния ляв и долу-вляво y-координати
височинаA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
височинаB = np.sqrt(((tl[0] - бл[0]) ** 2) + ((tl[1] - бл[1]) ** 2))
maxHeight = max (int (heightA), int (heightB))

конструирайте набор от точки на дестинация, за да получите изстрел отгоре
dst = np.array([
[0, 0],
[maxWidth - 1, 0],
[maxWidth - 1, максимална височина - 1],
[0, максимална височина - 1]], dtype = "float32")

# изчисляване на матрицата за трансформация на перспектива
transform_matrix = cv2.getPerspectiveTransform (прав, dst)

# Приложете трансформиращата матрица
изкривено = cv2.warpPerspective (изображение, transform_matrix, (maxWidth, maxHeight))

# върне изкривеното изображение
връщане изкривена

Вече създадохте трансформационния модул. Грешката при импортирането на perspective_transform вече ще изчезне.

Забележете, че показаното изображение има снимка отгоре.

Прилагане на адаптивен праг и запазване на сканирания изход

Във файла main.py приложете прага на Гаус към изкривеното изображение. Това ще придаде на изкривеното изображение сканиран вид. Запазете изхода на сканираното изображение в папката, съдържаща програмните файлове.

T = threshold_local (изкривено_изображение, 11, отместване=10, метод="гаусов")
изкривено = (изкривено_изображение > T).astype("uint8") * 255
cv2.imwrite('./'+"сканиране"+".png", изкривено)

Запазването на сканирането във формат PNG запазва качеството на документа.

Показване на изхода

Изведете изображението на сканирания документ:

cv2.imshow(„Окончателно сканирано изображение“, imutils.resize (изкривено, височина=650))
cv2.waitKey(0)
cv2.destroyAllWindows()

Следното изображение показва резултата от програмата, снимка отгоре на сканирания документ.

Как да напреднете в компютърното зрение

Създаването на скенер за документи обхваща някои основни области на компютърното зрение, което е широко и сложно поле. За да напреднете в компютърното зрение, трябва да работите върху интересни, но предизвикателни проекти.

Трябва също да прочетете повече за това как можете да използвате компютърно зрение с настоящите технологии. Това ще ви държи в течение и ще ви дава нови идеи за проекти, по които да работите.