Рубрики
Без рубрики

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

Вы знаете, просто еще одна случайная история … За кулисами, если вы следовали за мной F … помечены с помощью ImageProcessing, Python, сегодня предшествуют.

Вы знаете, просто еще одна случайная история …

Если вы следовали за мной, с самого начала моего путешествия на этой замечательной платформе блогов, в Dev.to Конечно, вы уже заметили, что я использую подсистему Windows для Linux AKA WSL2 на данный момент. Но, начиная с трех месяцев назад, или четыре, я решил вернуться в Федору. Эх? Что? Итак, сегодня я собираюсь рассказать вам другую историю, а не техническое сообщение в блоге, о личном проекте началось 15 февраля, на который я привернулся.

Подождите, какие отношения между переездом в Федору и развитие этого проекта? Вам может быть интересно, не вы? Нет? Это нормально, лол. Во всяком случае, одна из главных причин, по которым я всегда в конечном итоге Федора, это то, что я получаю оригинальный аромат Гнома Настольная среда. Никаких пользовательских тем, ничто не изменяется вообще, кроме нескольких расширений, которые я установил позже, GsConnect Например.

Я просто люблю целую экосистему Gnome, которая заставила меня работать в установке почти всех приложений GNOME каждый раз, когда я нашел новый, несмотря на неиспользуемый, лол. Я имею в виду, все приложения, которые написаны в ГТК Особенно, так как у всех нас есть красивый заголовок. Это очень причина привела меня к тому, что мне нужно найти приложение для конкретных целей, что должно быть приложение GTK на первом месте. Точно так же, когда я должен разработать настольное приложение. Err … Хотя это внимание не имеет ничего общего с этим постом. Ха-ха-ха … Ну, достаточно говорить тогда! Хорошо, давайте перейдем!

Между тем, эта дискуссия будет ограничена только основными проблемами, с которыми я испытал. Вы знаете, как Коран или Коран, всегда был записан сегодня? Пример Насколько мне известно, Медина Коран всегда написана, по Король Фахд славный Коран Печатный комплекс в Саудовской Аравии, вручную. Возможно, мы слышали Утман Таха , каллиграф Мусхаф Аль-Мадина, или у нас даже есть kfgqpc Uthman Taha Naskh.

Я уверен, что Коран, который принадлежит всем, кто был написан кем-то, имеет руку. Я хотел написать: кто-то; Это звучит по-другому? Пожалуйста, скажите мне, o, ты хорош. И тогда копии были воспроизведены и распространены по всему миру. В настоящее время почему-то мы можем легко получить Коран в наших карманах как цифровое приложение. Итак, мы можем прочитать везде, где и всякий раз, когда мы хотим. Для этих сообщений добротой можно искать, скопированы и поделиться, многие люди борются за удовлетворение стандартов Unicode, вместо того, чтобы предоставить Коран как только изображения. К сожалению, так случилось, чтобы принести новый вопрос. Перед продолжением, вы можете попытаться выяснить разницу между Zekr и Аят заявление.

Пагинация, макет, шрифт, ET CETERA В цифровом мире часто выглядят по-разному. Если бы мы были читать и запоминать Коран из Мусшафа, это может быть так раздражает, по крайней мере, для кого-то делают Халака Отказ Многие ученые, которые великолепны при запоминании Корана, также запоминают вещи, которые думают, что люди, включая меня раньше, не были очень важны, например, где страница, которая эта специфическая ая или стих принадлежит. Еще более конкретные вещи: на какой линии и в каком сложном положении. Итак, каждый раз получил вопрос, они могут быстро обратиться к связанным страницам. Следовательно, я решил показать Коран как изображения на основе официальной печатной медицинской помощи Корана. Между тем, эти ая все еще можно искать и скопировать, так как мы включили базу данных Корана в текстах-кодировке машин.

Но истинная история не сказала … Я знаю, я знаю, я собираюсь сказать вам. Используя изображения, как приложение знает, что область страницы, которую мы нажимаем на принадлежащую к какой суре и аях? Ах, получил это! Итак, проблема в том, как мы делаем отображение. В проще, как выбрать ая на картинке. Точно! Как только нам удалось найти лучший метод, мы могли бы применить его к другим стандартам и другим Qira’at Печать также. Однако лучше перейдите с перекрестным платформенным графическим интерфейсом пользователя (GUI) или Toolkit, если вы хотите поставить эту широкую аудиторию. Да, это было под моим рассмотрением, и кажется, остается. Это просто мое эго вообще.

История началась с загрузки файла Quran PDF из Официальный сайт комплекса Корана . Мне лучше взять чашку чая, потому что это заняло некоторое время для моей картошки …

По пути у меня есть идеи в моей голове, чтобы решить это. Большинство из них были невозможны для меня в данный момент, так как оказалось, что мне нужно изучить некоторые методы обучения машин, которые я буду глупо, чтобы узнать себе. Я знаю лучше всего, если я стараюсь изо всех сил учиться, я составлю свои собственные возможности! Но так как я делаю это, чтобы обеспечить только доказательство концепции моего цифрового приложения Корана, Грапик Коран Я не хочу принять слишком много усилий в это еще. Не говоря уже о том, что я только начал изучать GTK +; Есть много, чтобы учиться, поэтому я должен управлять своим временем, как можно лучше.

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

Лень начинается с ручной работы письма алгоритмов компьютерного зрения или даже просто использовать их, поскольку они могут быть легко импортированы, просто позвонив Импорт CV2. , Да, я. Итак, мне было интересно, сможете ли я сделать прогнозы с каким-то моделью машинного обучения; Кто-то другая модель, конечно. Посмотрев это некоторое время, я ничего не нашел.

Хорошо, позвольте мне подуматься об этом. Я был слишком наивен, чтобы не записать то, что я точно нужно. Это случилось с кем-то, кто действительно думал о нем как довольно умным, или кому-то, кто слишком поспешно делает что-то; Я выучил урок от этого. Для того, чтобы сегментировать Ayahs с страниц изображения, нам нужно:

  1. Извлеките все линии с Ayah (ыми), исключая всю другую информацию, такую как номера страниц, Juz, Hizb и все орнаменты. Линии должны быть отсортированы по внешнему виду сверху вниз;
  2. Найдите все маркеры Суры и Ая на каждой строки, если таковые имеются; а также
  3. Итайте на всех маркерах от самой первой линии до конца. Делать это последовательно с первой страницы Корана, где расположен Сура Аль-Фатихах, мы сможем правильно сопоставить их к каждой суре и аям.

Звучит просто, не так ли? Чтобы получить лучшую идею, позвольте мне показать вам, как должны выглядеть окончательные результаты:

Они выглядят великолепно, верно? Давайте скажем в основную историю сейчас …

1. Извлечение строк страницы

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

Как я уже сказал, я ленивый и все еще я … Поэтому я думал о поисках библиотек Python для этого. Тогда я был сделан, чтобы понять, что это что-то связано с распознавание оптического персонажа Отказ Итак, я играл вокруг с Pytesseract :

import cv2
from pytesseract import image_to_data, Output


image = cv2.imread('dataset/quran-images/3.png')
d = image_to_data(image, 'ara', output_type=Output.DICT)
print(d.keys())

n_boxes = len(d['text'])
for i in range(n_boxes):
    if int(d['conf'][i]) > 60:
        (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i])
        image = cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)

cv2.imshow('Result', image)
cv2.waitKey(0)

а также EaseOrr :

import easyocr


reader = easyocr.Reader(['ar'])
result = reader.readtext('dataset/quran-images/3.png')

К сожалению, они не были способны. Pytesseract был худшим; EaseOrton, по крайней мере, мог дать мне некоторые идеи, но это не было ни стабильного, ни точника. Реальная задача здесь заключается в том, что тексты рукописные, и все они имеют диакритики. Идея этого подхода заключается в том, что я хотел бы извлечь как можно больше информации, включая номера Суры, Ая, Юз и Хизб.

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

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

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

$ sudo dnf install --yes poppler-utils
...

$ pip install pdf2image opencv-python matplotlib
...

Затем, в моем ноутбуке Jupyter, я написал это:

from pdf2image import convert_from_path


pages = convert_from_path('dataset/quran-images/hafs-standard39.pdf', dpi=190)

Как-то, он съел всю мою память;

Таким образом, я сделал это вместо этого:

from pdf2image import convert_from_path
import tempfile


with tempfile.TemporaryDirectory() as outdir:
    filepath = 'dataset/quran-images/hafs-standard39.pdf'
    pages = convert_from_path(filepath, dpi=190, output_folder=outdir)

Или даже сделать выборку, чтобы получить только 5-8 изображений.

Далее эти линии:

import cv2
import numpy as np
from matplotlib import pyplot as plt


img = cv2.cvtColor(np.array(pages[5]), cv2.COLOR_RGB2BGR)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_mod = cv2.GaussianBlur(img_gray, (15, 15), 0)
_, img_mod = cv2.threshold(
    img_mod, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

w = 456  # image preview width in pixels
scale = w / img.shape[1]
h = int(img.shape[0] * scale)
plt.rcParams.update({
    'figure.figsize': (h / (96 / 3), w / (96 / 3)),
    'axes.spines.left': False,
    'axes.spines.right': False,
    'axes.spines.top': False,
    'axes.spines.bottom': False,
    'xtick.bottom': False,
    'xtick.labelbottom': False,
    'ytick.labelleft': False,
    'ytick.left': False
})

plt.imshow(img_mod)
plt.show()

приведет к:

Понял, ты? Давайте продолжим писать …

img_mod = cv2.Canny(img_mod, 100, 200)
kernel = np.ones((2, 2), np.uint8)
img_mod = cv2.dilate(img_mod, kernel)
cv2.floodFill(img_mod, None, (0, 0), 255)
cv2.floodFill(img_mod, None, (0, 0), 0)

plt.imshow(img_mod)
plt.show()

И та-да!

Тогда мы могли бы сделать что-то вроде:

bboxes = cv2.findContours(img_mod, cv2.RETR_EXTERNAL,
                          cv2.CHAIN_APPROX_SIMPLE)
bboxes = bboxes[0] if len(bboxes) == 2 else bboxes[1]
x, y, w, h = cv2.boundingRect(max(bboxes, key=cv2.contourArea))

и наконец:

img_mod[y:y+h, x:x+w] = img_thres[y:y+h, x:x+w]

Чтобы получить границу страницы и все его содержание внутри. Здорово! Далее, давайте поговорим о нескольких алгоритмах на строки страницы сегмента. Для этого вы позволите мне написать это как в поле поиска Google:

line segmentation site:github.com

РЖУ НЕ МОГУ! Ну, ты не судишь меня вообще.

После просмотра скрининга я придумал вывод:

  • Я не хотел ни одного пути, находящихся подходов, поскольку они, кажется, не дают мне прямые линии;
  • Я не хотел, чтобы никаких кодов, написанных в чем-либо, кроме Python, потому что я не был знаком;
  • Я не хотел этого и что …

В конце концов, мне нужно было реализовать свои собственные, сочетая все эти подходы к ней. До недели спустя я был таким самым счастливым человеком в мире, когда, казалось, работал на изображениях Корана из Университета King Saud, который использовался для Применение Ayat. . Но, давай, код был грязным (вам даже не понравится, чтобы увидеть его связанные общественные коммиты в моем репозитории GitHub; это все еще там), и мне не повезло в подачении других мусхостей.

Третье испытание; Сделать это просто, чувак! Я потерял надежду, пока не ленивый. Это я поняла: иногда, все в порядке, потому что это может быть ленивым, потому что это может превратить нас в творческие люди, как сказал, что сказал Билл Гейтс (если я не ошибся). Но действительно, иногда:

Программисты любят придумать умные способы решения несуществующих проблем- https://news.ycombinator.com/item?id=18180017.

С тех пор я вернулся к прошедшим способам сделать это и что;

  1. Определение количества строк на этой странице;
  2. получение границы страницы; а также тогда
  3. Разделение области одинаково.

Точки.

2. Поиск маркеров Ayah

Хорошо, просто сделайте шаблон для этого. Просто,

  1. Откройте PDF, используя Эванс или любой PDF-ридер;
  2. Установите увеличение на 100%;
  3. Нажмите Сдвиг и рт. сюжет (Печать экрана) ключей, затем используйте мыши для сбора скриншота Суры, Бисмиллы и маркеров Ayah в качестве образцов; а также
  4. Google на том, как делать шаблон сопоставления в Python!

Нах, как это просто!

3. Итерация над линиями

Да, следующие шаги, которые нужно предпринять (1) итерацию каждой строки во время увеличения чисел суры и ая, (2) сегментирование каждой строки, основанной на появлении маркеров Ayah, если таковые имеются, и (3) сохранение всей информации в один файл CSV. Мы можем захотеть применить некоторую почтовую обработку позже. Ну, я слишком устал, чтобы уточнить. Вздох … Я надеюсь, что у вас есть идея. Этот файл CSV может содержать что-то вроде:

page,sura,aya,x1,y1,x2,y2
4,1,1,248,537,578,591
4,1,2,158,537,248,591
4,1,2,202,591,578,645
4,1,3,158,591,202,645
4,1,3,384,645,578,699
4,1,4,158,645,384,699
4,1,5,238,699,578,753
4,1,6,158,699,238,753
4,1,6,354,753,578,807
4,1,7,158,753,354,807
4,1,7,158,807,578,861
4,1,7,158,861,578,921

Если вы чувствуете заинтересованность, поскольку все эти вещи были загружены, вы всегда можете получить доступ к всем своим случайным вещам здесь:

Наруаика/моя детская площадка

Мои случайные исследования по предмету интереса

После истории

Я выяснил, что вокруг границы страницы было потрачено впустую пространство;

Завершивание запуска моего экрана без лучшей причины, чем иметь номер страницы, JUZ и HIZB, а также другие, рядом с границей страницы. Ибо я хочу иметь дело со всеми теми в моей прикладной навигационной системе. Давай, давайте исправим это!

$ ls
alasbahani-mad.pdf  hafs-standard39.pdf     kasr-elbadl.pdf       qiraat-naskh.pdf   qiraat-sousi.pdf
albahrain.pdf       hafs-standardthree.pdf  muyassar-ghareeb.pdf  qiraat-qaloon.pdf  qiraat-warsh39.pdf
hafs-jawamee39.pdf  hafs-wasat39.pdf        qiraat-douri.pdf      qiraat-shuba.pdf   tawassot-elbadl.pdf

# Convert PDF to JPEG images
$ mkdir -p hafs-standard39
$ pdftoppm -jpeg -r 190 -e hafs-standard39.pdf hafs-standard39/even
$ pdftoppm -jpeg -r 190 -o hafs-standard39.pdf hafs-standard39/odd

# Optimise the output images
$ sudo dnf install --yes jpegoptim
$ mkdir -p hafs-standard39/optimized
$ jpegoptim hafs-standard39/*.jpg --dest hafs-standard39/optimized/
... 

Затем, используя GIMP;

  1. Открыть даже - *. JPG как слои (Ctrl + Alt + O);
  2. Обрезать все даже страницы на (57, 127) Размер 774 к 1190 пиксели вручную. Не забудьте включить опцию «Удалить подрезанный пиксель» при обрезке;
  3. Экспортируйте все из них как отдельные изображения JPEG, используя плагин Экспортные слои ; а также
  4. Повторите для всех нечетных страниц.

С первых двух страниц и раньше, по-видимому, иметь другое выравнивание, повторите для них отдельно. Хотя нам нужны дополнительные ручные операции, такие как выравнивание и изменение размера изображений над слоями. Вы можете решить не включать все страницы, которые не содержали Ayahs. Но так как я хотел сохранить количество страниц как оригинал, я тоже их порезал.

После этого, используя Nautilus, мы можем переименовать их, чтобы удалить четное- и странный- префиксы. Чтобы удалить префикс нуля, переименуйте их с помощью шаблона: [1, 2, 3] .

Поскольку теперь у нас есть изображения JPEG вместо файлов PDF, так оказывается, что нам придется изменить начальные несколько строк нашего кода. Но это все на данный момент. До скорой встречи!

Оригинал: “https://dev.to/naruaika/how-i-managed-to-pre-processing-musshaf-images-16l6”