Автоматичне вирівнювання зображень
Для тих, хто сканує або обробляє скани, не секрет, що вирівнювання сканованих зображень досить неприємна процедура (якщо робити руками). Є кілька підходів (алгоритмів) для автоматичного вирівнювання. Основа обох методів - знаходження ліній в зображенні, по відхиленню цих ліній від горизонталі / вертикалі можна судити про те, як зображення повернути. Відкидаються найбожевільніші варіанти і картинка повернута куди треба.
Я користувався спочатку алгоритмом Хуфа. який добре описаний в інтернеті і дає в принципі непогані результати. Але - тільки на зображеннях, що складаються цілком з тексту. А у мене завдання - вирівнювати картинки з текстом і малюнками. (Я займаюся у вільний час скануванням і відновленням радянських книжок. І ось це саме перетворення настільки дивовижно розпізнає лінії і обчислює кут нахилу, що я вирішив знайти, звідки ж ноги ростуть, і спробувати переписати це на Java. Вихідні тексти знаходяться тут. Код настільки заплутаний і оптимізований під С ++, що переклад зайняв десь дня 2. Ось, що з цього вийшло:
Алгоритм працює чортихи швидко за рахунок карти усіх можливих варіантів бітів в байті, тобто за одну ітерацію прораховується відразу 8 пікселів. Але як він працює і що відбувається всередині, для мене загадка :) Головне, що працює.
Не вірю своїм очам. Бувають же збіги.
Два дні тому я закінчив перенести цей же код на Java. І процес, до речі, теж зайняв пару днів. В основному, через тотальне нерозуміння суті алгоритму. Спроба почитати теорію все тільки остаточно заплутала. Але начебто все запрацювало як треба.
Зараз ось думаю як вирішити питання з autocrop. Шукаю які є вже напрацювання в мережі - і ось нарвався на твій пост.
З autocrop можна взяти шматочок з ImageMagic - там є trim опція, яка простенько вирізає область з найбільшою щільністю контенту.
Я теж думаю над autocrop, але у мене специфіка інша - я вирізаю скани - там по краях бяки і залишкові лінії після очищення від фону. Коли напишу, викладу.
До речі, а навіщо DJVU в PDF конвертах? Перший формат же ж краще підходить для сканованих книг. У PDF доки виходять більше і якість не дуже - дозвіл зменшується.
> До речі, а навіщо DJVU в PDF конвертах? Перший формат же> ж краще підходить для сканованих книг. У PDF доки> виходять більше і якість не дуже - дозвіл> зменшується.
> Я теж думаю над autocrop, але у мене специфіка інша -> я вирізаю скани - там по краях бяки і залишкові лінії> після очищення від фону. Коли напишу, викладу.
У мене постановка задачі ідеентічна: точно такі ж необроблені брудні скани, але тільки зверстані в djvu.
Я цей тиждень у відпустці, повернуся - займуся питанням щільніше (якщо не буде завалів по основній роботі). З'являться які ідейки - поділюся.
До речі, якщо цікаво, ще одна проблема - бляклі кольору шрифту. Вирішив вже майже. Проблема в тому, що хочеться робити це автоматично, і не можна просто певний колір (колір шрифту) зробити чорним, тому як він ще зустрічається в інших місцях - наприклад, книга з кольоровими картинками, або фон у шрифту є з картинки. Я роблю так - вибирається в книзі сторінка, де є і картинка, і текст. Потім вироблені область, де є тільки текст. Визначаємо об'єкти, що містяться на сторінці. Тим об'єктів, які в зоні тексту, присвоюємо лейбл "Текст", іншим "Image". З'єднуємо ближайщие один до одного об'єкти в якісь групи, наприклад, по 3-4 і записуємо зв'язку та розміри об'єктів в масив ознак. Потім самоорганізується мапе даємо їх все - тренуємо. В кінці виходить дуже якісний распознаватель, що є текст, а що ні. Спробував на одній дитячій книзі, результати 100% вгадування на сторінці, по якій навчалися. Треба тепер для підкріплення спробувати на інших сторінках. Якщо все це вийде, напишу ще статейку, як це робити. Єдина бяка, це що алгоритму треба спочатку показати область з текстом - навчити. Але ніде в інтернеті нічого кращого я не знайшов.
Зробив я більш-менш прийнятний алгоритм обрізання полів. Звичайно, багато в чому він підігнаний під мої тестові документи і на універсальність не претендує. Але ось тестую все підряд - в основному запаривает тільки на обкладинках і рясно ілюстрованих сторінках (не може розпізнати, де закінчується бруд і починається картинка або краю картинки може прийняти за тінь від палітурки). Думаю за тиждень сліпли нову версію.
Твої напрацювання по відбілюванню сторінок-зачерненого букв мені дуже цікаві. Зараз я просто заливаю білим або чорним всі пікселі, але вони не попадають в певні межі. В результаті - діряві і драні по краях букви.
Ось чого я нарив з приводу autocrop.
Хлопці пропонують непоганий метод. Імплементацію можна підглянути в ocropus.