Такие читатели, как вы, помогают поддерживать MUO. Когда вы совершаете покупку по ссылкам на нашем сайте, мы можем получать партнерскую комиссию. Читать далее.

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

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

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

Чтобы читать эту статью, вы должны быть знакомы с основы Python. Вы также должны иметь представление о как работать с библиотекой NumPy Python.

Откройте любую среду разработки Python и создайте два файла Python. Назовите один файл main.py, а другой — transform.py. Затем выполните следующую команду на терминале, чтобы установить необходимые библиотеки.

instagram viewer

pip установить OpenCV-Python imutils scikit-image NumPy

Вы будете использовать OpenCV-Python для ввода изображения и выполнения некоторой обработки изображения. Imutils для изменения размера входных и выходных изображений. scikit-image, чтобы применить порог к изображению. NumPy поможет вам работать с массивами.

Дождитесь завершения установки и пока среда IDE обновит скелеты проекта. После завершения обновления скелетов вы готовы начать кодирование. Полный исходный код доступен в Репозиторий GitHub.

Импорт установленных библиотек

Откройте файл main.py и импортируйте библиотеки, которые вы установили в среду. Это позволит вам вызывать и использовать их функции там, где это необходимо.

Импортировать cv2
Импортировать imutils
от skimage.filters Импортировать порог_местный
от трансформировать Импортировать перспектива_трансформировать

Не обращайте внимания на ошибку, выдаваемую вspective_transform. Он исчезнет, ​​когда вы закончите работу с файлом transform.py.

Получение и изменение размера ввода

Сделайте четкое изображение документа, который хотите отсканировать. Убедитесь, что четыре угла документа и его содержимое видны. Скопируйте изображение в ту же папку, в которой хранятся файлы программы.

Передайте путь входного изображения в OpenCV. Сделайте копию исходного изображения, так как оно понадобится вам при преобразовании перспективы. Разделите высоту исходного изображения на высоту, до которой вы хотите изменить его размер. Это позволит сохранить соотношение сторон. Наконец, выведите изображение с измененным размером.

# Передача пути к изображению
original_img = cv2.imread('образец.jpg')
копия = original_img.copy()

# Высота измененного размера в сотнях
соотношение = original_img.shape[0] / 500.0
img_resize = imutils.resize (original_img, высота =500)

# Отображение вывода
cv2.imshow («Измененный размер изображения», img_resize)

# Ожидание нажатия пользователем любой клавиши
cv2.waitKey(0)

Вывод приведенного выше кода выглядит следующим образом:

Теперь вы изменили размер исходного изображения до 500 пикселей.

Преобразование изображения с измененным размером в оттенки серого

Преобразуйте измененное изображение RGB в оттенки серого. Большинство библиотек обработки изображений работают только с изображениями в градациях серого, поскольку их легче обрабатывать.

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

Обратите внимание на разницу между исходным изображением и серым.

Цветная таблица превратилась в черно-белую.

Применение детектора краев

Примените фильтр размытия по Гауссу к серому изображению, чтобы удалить шум. Затем вызовите функцию openCV canny, чтобы обнаружить ребра, присутствующие в изображении.

blurred_image = cv2.GaussianBlur (серое_изображение, (5, 5), 0)
edged_img = cv2.Canny (размытое_изображение, 75, 200)
cv2.imshow («Края изображения»,eded_img)
cv2.waitKey(0)

Края видны на выходе.

Края, с которыми вы будете работать, — это края документа.

Нахождение самого большого контура

Обнаружьте контуры, присутствующие в изображении с краями. Отсортируйте их в порядке убывания, оставив только пять самых больших контуров. Аппроксимируйте самый большой контур с четырьмя сторонами, перебирая отсортированные контуры.

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

для с в центов:
пери = cv2.arcLength (c, Истинный)
приблизительно = cv2.приблизительноPolyDP(c, 0.02 * пери, Истинный)

если Лен (приблизительно) == 4:
документ = приблизительно
перерыв

Контур с четырьмя сторонами, вероятно, содержит документ.

Обведение четырех углов контура документа

Обведите углы обнаруженного контура документа. Это поможет вам определить, смогла ли ваша программа обнаружить документ на изображении.

р = []

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

cv2.imshow («Обведенные угловые точки», img_resize)
cv2.waitKey(0)

Реализуйте кружение на изображении RGB с измененным размером.

Обнаружив документ, теперь вам нужно извлечь документ из изображения.

Использование перспективы деформации для получения желаемого изображения

Деформация перспективы — это метод компьютерного зрения для преобразования изображения для исправления искажений. Он преобразует изображение в другую плоскость, позволяя вам просматривать изображение под другим углом.

warped_image = перспектива_преобразования (копия, doc.reshape(4, 2) * соотношение)
warped_image = cv2.cvtColor (warped_image, cv2.COLOR_BGR2GRAY)
cv2.imshow («Искривленное изображение», imutils.resize (warped_image, высота =650))
cv2.waitKey(0)

Для получения искаженного изображения необходимо создать простой модуль который будет выполнять перспективное преобразование.

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

Модуль упорядочит точки углов документа. Это также преобразует изображение документа в другую плоскость и меняет угол камеры на снимок сверху.

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

Импортировать пустышка как нп
Импортировать cv2

Этот модуль будет содержать две функции. Создайте функцию, которая будет упорядочивать координаты угловых точек документа. Первая координата будет координатой верхнего левого угла, вторая будет координатой верхнего правого угла, третья будет в нижнем правом углу, а четвертая координата будет в нижнем левом углу угол.

дефorder_points(баллы):
# инициализируем список координат для упорядочения
прямоугольник = np.zeros((4, 2), дтип = "поплавок32")

s = pts.sum (ось = 1)

# верхняя левая точка будет иметь наименьшую сумму
прямо [0] = pts[np.argmin (s)]

# нижняя правая точка будет иметь наибольшую сумму
прямо [2] = pts[np.argmax (s)]

вычисление разницы между точками,
верхняя правая точка будет иметь наименьшую разницу,
тогда как нижний левый будет иметь самую большую разницу
diff = np.diff (pts, ось = 1)
прямо [1] = pts[np.argmin (diff)]
прямо [3] = pts[np.argmax (diff)]

# возвращает упорядоченные координаты
возвращаться прямой

Создайте вторую функцию, которая будет вычислять угловые координаты нового изображения и получать план сверху. Затем он рассчитает матрицу преобразования перспективы и вернет искаженное изображение.

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

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

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

построить набор точек назначения для получения выстрела сверху
dst = np.массив([
[0, 0],
[Максимальная ширина - 1, 0],
[Максимальная ширина - 1, максимальная высота - 1],
[0, максимальная высота - 1]], дтип = "поплавок32")

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

# Применяем матрицу преобразования
warped = cv2.warpPerspective (изображение, transform_matrix, (maxWidth, maxHeight))

# вернуть искаженное изображение
возвращаться деформированный

Теперь вы создали модуль преобразования. Ошибка при импорте перспективы_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()

На следующем изображении показан результат работы программы, вид сверху отсканированного документа.

Как продвинуться в области компьютерного зрения

Создание сканера документов охватывает некоторые основные области компьютерного зрения, которое является широкой и сложной областью. Чтобы продвинуться в области компьютерного зрения, вы должны работать над интересными, но сложными проектами.

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