Содержание

Что делать, если ABBYY FineReader не видит сканер

Abbyy Finereader – программа для распознавания текста с изображениями. Источником картинок, как правило, является сканер или МФУ. Прямо из окна приложения можно произвести сканирование, после чего автоматически перевести изображение в текст. Кроме того, Файн Ридер умеет сконвертировать полученные со сканера изображения в формат PDF и FB2, что полезно при создании электронных книг и документации для последующей печати.

Как устранить проблему: ABBYY Finereader не видит сканер.

Для корректной работы Abbyy Finereader 14 (последняя версия) на компьютере должны выполняться следующие требования:

  • процессор с частотой от 1 ГГц и поддержкой набора инструкций SSE2;
  • ОС Windows 10, 8.1, 8, 7;
  • оперативная память от 1 Гб, рекомендованная – 4Гб;
  • TWAIN- или WIA-совместимое устройство ввода изображений;
  • доступ в интернет для активации.

Если ваше оборудование не отвечает данным требованиям, программа может работать некорректно. Но и при соблюдении всех условий, Abbyy FineReader часто выдаёт разные ошибки сканирования, такие как:

  • невозможно открыть источник TWAIN;
  • параметр задан неверно;
  • внутренняя программная ошибка;
  • ошибка инициализации источника.

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

Есть ряд общих советов по исправлению некорректной работы:

  1. Обновите драйверы оборудования до последних версий с официального сайта производителя.
  2. Проверьте права текущего пользователя в системе, при необходимости повысьте уровень доступа.
  3. Иногда помогает установка более старой версии приложения, особенно если вы работаете на не новом оборудовании.
  4. Проверьте, видит ли сканер сама система. Если он не отображается в диспетчере устройств или показан с жёлтым восклицательным знаком, то проблема в оборудовании, а не программе. Обратитесь к инструкции или в техподдержку производителя.
  5. На официальном сайте ABBYY работает неплохая техническая поддержка https://www.abbyy.com/ru-ru/support. Вы можете задать вопрос, подробно описав конкретно свою проблему, и получить профессиональное решение из первых рук абсолютно бесплатно.

Устранение ошибки «Параметр задан неверно»

В последней версии ABBYY FineReader также может носить название «Ошибка инициализации источника». Инициализация – это процесс подключения и распознавания системой оборудования. 

Если Файн Ридер не видит сканер при запуске диалогового окна сканирования и выдаёт такие ошибки, то должны помочь следующие действия:

  1. Перезапустите программу FineReader.
  2. Зайдите в меню «Инструменты», выберите «OCR-редактор».
  3. Нажмите «Инструменты», потом «Настройки».
  4. Включите раздел «Основные».
  5. Перейдите к «Выбор устройства для получения изображений», затем «Выберите устройство».
  6. Нажмите на выпадающий список доступных драйверов. Проверьте работоспособность сканирования поочерёдно с каждым из списка. В случае успеха с каким-то из них, используйте его в дальнейшем.

ВНИМАНИЕ. Возможна и такая ситуация, что ни с каким из доступных драйверов выполнить сканирование не получилось. Тогда нажмите «Использовать интерфейс сканера». 

Если и это не помогло, вам понадобится утилита TWAIN_32 Twacker. Её можно скачать с официального сайта ABBYY по ссылке ftp://ftp.abbyy.com/TechSupport/twack_32.zip.

После этого следуйте инструкции:

  1. Выйдите из Файн Ридер.
  2. Распакуйте архив twack_32.zip в любую папку.
  3. Дважды щёлкните по Twack_32.exe.
  4. После запуска программы зайдите в меню «File», затем «Acquire».
  5. Нажмите «Scan» в открывшемся диалоге.
  6. Если документ успешно отсканировался, откройте меню «File» и щёлкните «Select Source».
  7. Синим цветом окажется отображён драйвер, через который утилита успешно выполнила сканирование.
  8. Выберите этот же файл драйвера в файнридере.

Если при запуске в Abbyy Finereader этого сделать опять не удалось, значит, проблема в работе программы. Отправьте запрос в техническую поддержку ABBYY. Если же и 32 Twacker не смог выполнить команду «Scan», то, вероятно, некорректно работает само устройство или его драйвер. Обратитесь в техподдержку производителя сканера.

Внутренняя программная ошибка

Бывает, что при запуске сканирования приложение сообщает «Внутренняя программная ошибка, код 142». Она обычно связана с удалением или повреждением системных файлов программы. Для исправления и предотвращения повторных появлений выполните следующее:

  1. Добавьте Fine Reader в исключения антивирусного ПО.
  2. Перейдите в «Панель управления», «Установка и удаление программ». 
  3. Найдите Fine Reader и нажмите «Изменить».
  4. Теперь выберите «Восстановить».
  5. Запустите программу и попробуйте отсканировать документ.

Иногда Файнридер может не видеть сканер из-за ограничений в доступе. Запустите программу от имени администратора либо повысьте права текущего пользователя.

Таким образом решается проблема подключения программы Fine Reader к сканеру. Иногда причина в конфликте драйверов или несовместимости оборудования. А бывает, сбой сканирования возникает из-за внутренних программных ошибок. Если вы сталкивались с подобными проблемами в файнридере, оставляйте советы и способы решения в комментариях.

Коррекция изображений| Как пользоваться| Imaging Edge Desktop

Каждую палитру можно использовать для регулировки яркости, цветовых тонов, эффектов и т.п.

* Чтобы изменить порядок, перетащите на правом краю каждого пункта.

  • Яркость (коррекция экспозиции)
  • Баланс белого
  • Творческий Стиль/Творческий Вид
  • Контрастность
  • Оптим.Д-диапаз.
  • Воспр. цвета светлых участков
  • Цвет
  • Компенсация паразитного сигнала
  • Четкость
  • Шумоподавление
  • Коррекция объектива
  • Кривая тонов
  • Управление отображением
  • Коррекция М/съем. с сдв.пикс.
  • Набор версий
Совет

В приложении Edit можно использовать только следующие три функции регулировки для файлов JPEG или TIFF:

  • Регулировка градационной кривой
  • Коррекция выравнивания фона изображения
  • Поворот изображения

Яркость (коррекция экспозиции)

Эта функция корректирует яркость всего изображения. Значение коррекции экспозиции можно установить путем перемещения ползунка или ввода значения. Кроме того, можно увеличивать или уменьшать значение коррекции экспозиции на 1/3 EV при каждом нажатии кнопки [+] или [-]. При нажатии кнопки [Сброс] возвращается значение по умолчанию.

Баланс белого

  • A Настройка камеры

    Выберите эту установку, чтобы использовать параметры баланса белого во время съемки.

  • B Предустановка

    Выберите установку баланса белого для применения. Баланс белого можно настраивать путем перемещения ползунка.

  • C Цветовая температура

    Выберите цветовую температуру от желтого до синего путем перемещения ползунка или ввода значения.

  • D Задать точку серого

    Для более точного воспроизведения баланса белого можно указать ахроматическую область изображения и использовать ее в качестве образца для баланса белого. Точку можно указать с помощью (выбор цвета) или (выделение области).

  • E Цветовая коррекция

    Оттенок цвета можно корректировать от зеленого до пурпурного.

Творческий Стиль/Творческий Вид

Можно установить стиль цветопередачи. Выберите стиль из предустановок.
Название Творческий Стиль/Творческий Вид и подробности установки такие же, как в используемой камере.

Контрастность

Контрастность: При нажатии кнопки [+] контрастность увеличивается, и изображение становится более «жестким». При нажатии кнопки [-] контрастность уменьшается, и изображение становится более «мягким».

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

Тени: Можно отрегулировать темный цвет темных участков.

Эта функция удобна для уменьшения участков потери деталей в тенях.

Баланс белого: Можно отрегулировать яркость по всей гистограмме на основании уровня белого. Эта функция удобна для регулировки динамического диапазона всего изображения.

Баланс черного: Можно отрегулировать темный цвет по всей гистограмме на основании уровня черного. Эта функция удобна для регулировки динамического диапазона всего изображения.

Вы можете настроить степень исчезания в [Исчезание].

Оптим.Д-диапаз.

Если выбрано [Авто] или [Вручную], Оптимизатор Д-диапазона анализирует сцену и отдельно обрабатывает светлые и затененные участки, чтобы скорректировать их для оптимального баланса яркости и тона.Если выбрано [Вручную], точную регулировку до необходимого значения можно выполнить с помощью ползунка [Количество].

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

Воспр. цвета светлых участков

Если выбрано [Дополнительно], области высокой освещенности (яркости), например, небо, снятое в условиях очень яркого освещения, корректируются и отображаются с более естественным тоном.

Цвет

Можно скорректировать тон и насыщенность изображения.

Компенсация паразитного сигнала

Физические характеристики объектива приводят к меньшей освещенности периферийных областей изображения. Это явление можно компенсировать путем независимой корректировки центральных и периферийных областей.

  • A Центральный радиус

    Можно установить радиус центральной области.

  • B Центральная насыщенность

    Можно отрегулировать уровень коррекции освещенности внутри области, указанной в [Центральный радиус].

  • C Периферийная насыщенность

    Можно отрегулировать уровень коррекции яркости вне области, указанной в [Центральный радиус].

Четкость

Для повышения резкости изображения установите уровень усиления контуров.

  • A Количество

    Можно отрегулировать резкость всего изображения.

  • B Положительное отклонение

    Можно отрегулировать уровень усиления контуров в положительном направлении.

  • C Отрицательное отклонение

    Можно отрегулировать уровень усиления контуров в отрицательном направлении.

  • D Порог

    Можно установить порог применения усиления контуров.

  • E Диапазон “Резкость”

    Вы можете настроить диапазон, к которому применяется эффект резкости. Уменьшение значения смещает диапазон в сторону полосы низких частот, а увеличение значения смещает диапазон в сторону полосы высоких частот.

  • F Четкость

    Вы можете настроить четкость.

Шумоподавление

Если выбрано [Авто], выполняется автоматическая коррекция по уровню, соответствующему изображению. Если выбрано [Вручную], можно регулировать шумоподавление, корректировать цветовой шум (неравномерность цветов) и уменьшать контурный шум.

Примечание
  • В зависимости от исходного изображения и уровня корректировки шумоподавление может привести к понижению разрешения.

Коррекция объектива

Можно корректировать такие явления, вызванные физическими характеристиками объектива, как искажения и хроматическая аберрация.

Кривая тонов

Отображаются гистограммы и градационные кривые для всех каналов (RGBY).

Градационную кривую можно перетаскивать для регулировки каждого канала.

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

Выберите канал ([Y (яркость)], [R (красный)], [G (зеленый)] или [B (синий)]), который необходимо скорректировать, из раскрывающегося списка. Перетащите любую точку градационной кривой в необходимое положение, чтобы изменить кривую и отрегулировать яркость изображения. Перемещение в направлении левого верхнего угла повышает яркость изображения, а в направлении правого нижнего угла — понижает яркость. Для установки контрольной точки щелкните по точке в области. Градационная кривая будет проходить через контрольную точку.

Выберите [Сброс], чтобы сбросить только текущий выбранный канал. Выберите [Сброс всех значений], чтобы сбросить все каналы.

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

Управление отображением

Можно отобразить участки потери деталей в светах и тенях и цвета вне границ. [Подробно]

Коррекция М/съем. с сдв.пикс.

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

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

Набор версий

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

  • Отображение окна набора версий

    Нажмите в зафиксированной палитре и откройте палитру [Набор версий].
    Откроется список версий текущего выбранного изображения. Звездочка (*) отображается возле измененной версии.

  • Создание новой версии

    При нажатии (Создать новую версию) текущая выбранная версия копируется и добавляется в качестве новой версии.

  • Переключение между версиями

    Для выбора и редактирования версии выберите ее в списке версий.

  • Установка версии в качестве «Текущая версия»

    Версия, которая будет использоваться по умолчанию, если конкретная версия не указана, называется «Текущая версия». В списке версий выберите версию для установки в качестве «Текущая версия», а затем щелкните [Сделать текущим]. При следующем запуске приложения выбранное изображение будет «Текущая версия».

  • Удаление версии

    Выберите версию в списке версий, а затем щелкните (Удалить выбранную версию). Удалить «Как исходная версия» невозможно. Если удаляется текущая редактируемая версия, текущей становится предыдущая версия. В случае удаления «Текущая версия» предыдущая версии становится «Текущая версия».

python — Почему я не могу настроить уровни яркости файла PNG

У меня есть несколько отсканированных изображений, которые различаются по яркости. Я хочу выровнять уровни яркости, чтобы сделать изображения (как группу) более последовательными. Я позаимствовал некоторый код из SO (с небольшими изменениями), который был описан как делающий то, что мне нужно. Но код, кажется, не имеет никакого эффекта. Явно что-то делаю не так, но понять не могу. То, что я пытаюсь сделать, это прочитать воспринимаемый уровень яркости исходных изображений и, исходя из этого, рассчитать целевой уровень яркости и передать это значение функции, которая (теоретически) изменит яркость изображения до воспринимаемого уровня яркости и создаст новое изображение файл.

 из каталога импорта ОС
импортировать numpy как np
импорт cv2
из импорта PIL Image, ImageStat
оператор импорта
импортировать математику
яркость по определению (fname):
    с Image.open(fname) как img:
        stat = ImageStat.Stat(img)
        r,g,b = стат.среднее
    return int(math.sqrt(0,241*(r**2) + 0,691*(g**2) + 0,068*(b**2)))
def change_brightness (fname, значение):
    если значение == 0: возврат
    img = cv2.imread(SourceDir+fname,)
    hsv = cv2.cvtColor (изображение, cv2.COLOR_BGR2HSV)
    cv2.add(hsv[:,:,2], значение, hsv[:,:,2])
    img = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
    cv2.imwrite(DestDir+fname, img)
SourceDir = 'Я:\\'
DestDir = 'G:\\Документы\\'
Входные файлы = []
Уровень яркости = {}
Целевая яркость = 130
InputFiles = список каталогов (исходный каталог)
пытаться:
    InputFiles.remove('Информация о системном томе')
кроме:
    проходить
InputFiles.sort()
для InputFile в InputFiles:
    old_b = яркость (SourceDir+InputFile)
    изменить = TargetBrightness-old_b
    change_brightness (входной файл, изменение)
    new_b = яркость (DestDir+InputFile)
    BrightnessLevels[InputFile] = (старый_b, изменение, новый_b)
sorted_b = отсортировано (BrightnessLevels. items(), key=operator.itemgetter(1))
для f,b в sorted_b:
    распечатать (е, б)
 

Результаты, которые я получаю, следующие:

 Page-003.png (89, 41, 89)
Страница-082.png (89, 41, 89)
Страница-047.png (90, 40, 89)
Страница-075.png (92, 38, 91)
Страница-111.png (92, 38, 91)
Страница-071.png (92, 38, 92)
Страница-074.png (92, 38, 92)
Страница-077.png (92, 38, 92)
Страница-112.png (93, 37, 93)
Страница-079.png (94, 36, 93)
Страница-078.png (94, 36, 94)
Страница-031.png (95, 35, 95)
Страница-083.png (95, 35, 95)
Страница-023.png (96, 34, 96)
Страница-050.png (96, 34, 96)
Страница-081.png (96, 34, 96)
Страница-098.png (96, 34, 96)
Страница-099.png (96, 34, 96)
Страница-033.png (97, 33, 96)
Страница-094.png (97, 33, 97)
Страница-107.png (97, 33, 97)
Страница-038.png (98, 32, 98)
Страница-039.png (98, 32, 98)
Страница-095.png (98, 32, 98)
Страница-096.png (98, 32, 98)
Страница-106.png (98, 32, 98)
Страница-108.png (98, 32, 98)
Страница-018.png (99, 31, 99)
Страница-046.png (99, 31, 99)
Страница-072. png (99, 31, 99)
Страница-097.png (99, 31, 99)
Страница-066.png (100, 30, 99)
Страница-080.png (100, 30, 99)
Страница-110.png (100, 30, 99)
Страница-011.png (100, 30, 100)
Страница-121.png (100, 30, 100)
Страница-109.png (101, 29, 100)
Страница-006.png (101, 29, 101)
Страница-051.png (101, 29, 101)
Страница-007.png (102, 28, 102)
Страница-010.png (102, 28, 102)
Страница-015.png (102, 28, 102)
Страница-025.png (102, 28, 102)
Страница-049.png (102, 28, 102)
Страница-052.png (102, 28, 102)
Страница-056.png (102, 28, 102)
Страница-065.png (102, 28, 102)
Страница-076.png (102, 28, 102)
Страница-086.png (102, 28, 102)
Страница-102.png (102, 28, 102)
Страница-122.png (102, 28, 102)
Страница-067.png (103, 27, 102)
Страница-092.png (103, 27, 102)
Страница-116.png (103, 27, 102)
Страница-014.png (103, 27, 103)
Страница-084.png (103, 27, 103)
Страница-103.png (103, 27, 103)
Страница-115.png (103, 27, 103)
Страница-026.png (104, 26, 103)
Страница-059.png (104, 26, 103)
Страница-012.png (104, 26, 104)
Страница-024. png (104, 26, 104)
Страница-048.png (104, 26, 104)
Страница-123.png (104, 26, 104)
Страница-009.png (105, 25, 105)
Страница-034.png (105, 25, 105)
Страница-087.png (105, 25, 105)
Страница-114.png (105, 25, 105)
Страница-118.png (105, 25, 105)
Страница-119.png (105, 25, 105)
Страница-030.png (106, 24, 105)
Страница-043.png (106, 24, 105)
Страница-062.png (106, 24, 105)
Страница-063.png (106, 24, 105)
Страница-035.png (106, 24, 106)
Страница-126.png (106, 24, 106)
Страница-113.png (107, 23, 106)
Страница-044.png (107, 23, 107)
Страница-068.png (107, 23, 107)
Страница-019.png (108, 22, 107)
Страница-070.png (108, 22, 107)
Страница-054.png (108, 22, 108)
Страница-064.png (108, 22, 108)
Страница-090.png (108, 22, 108)
Страница-002.png (109, 21, 108)
Страница-058.png (109, 21, 108)
Страница-091.png (109, 21, 108)
Страница-020.png (109, 21, 109)
Страница-101.png (109, 21, 109)
Страница-104.png (110, 20, 109)
Страница-032.png (110, 20, 110)
Страница-004.png (111, 19, 111)
Страница-040.png (112, 18, 111)
Страница-021. png (112, 18, 112)
Страница-041.png (112, 18, 112)
Страница-061.png (113, 17, 113)
Страница-016.png (114, 16, 114)
Страница-055.png (114, 16, 114)
Страница-008.png (115, 15, 114)
Страница-117.png (115, 15, 115)
Страница-042.png (116, 14, 116)
Страница-036.png (118, 12, 117)
Страница-085.png (130, 0, 129)
Страница-022.png (131, -1, 131)
Страница-073.png (131, -1, 131)
Страница-027.png (133, -3, 132)
Страница-124.png (133, -3, 132)
Страница-005.png (133, -3, 133)
Страница-057.png (134, -4, 133)
Страница-013.png (135, -5, 135)
Страница-037.png (135, -5, 135)
Страница-105.png (137, -7, 137)
Страница-120.png (137, -7, 137)
Страница-045.png (138, -8, 138)
Страница-060.png (139, -9, 139)
Страница-093.png (139, -9, 139)
Страница-017.png (140, -10, 140)
Страница-125.png (141, -11, 140)
Страница-089.png (142, -12, 141)
Страница-029.png (142, -12, 142)
Страница-028.png (143, -13, 142)
Страница-069.png (145, -15, 145)
Страница-053.png (147, -17, 146)
Страница-100.png (149, -19, 149)
Страница-088.png (150, -20, 149)
 

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

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

по сравнению с вашим, где у нас может быть много структурированного шума на фоне (см. Демонстрацию ниже).

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

Тизер: так будут выглядеть ваши страницы после этого алгоритма (до и после). Обратите внимание, что даже аннотации цветовых маркеров исчезли, поэтому я не знаю, подойдет ли это для вашего варианта использования, но код может быть полезен:

Чтобы получить идеально чистые результаты , вам, возможно, придется немного поиграться с параметрами фильтрации, но, как вы видите, даже с параметрами по умолчанию все работает достаточно хорошо. 9Результаты этого шага приведены ниже (примеры, которые я использую здесь, возможно, сложнее, чем тот, который вы предоставили, хотя он может не совсем соответствовать вашему случаю):

Из этого сразу видно следующие проблемы:

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

Смысл этого шага в том, чтобы сбалансировать контрастность всего изображения (поскольку ваше изображение может быть слегка переэкспонировано/недоэкспонировано в зависимости от условий освещения).

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

 # Каким-то образом я нашел значение `gamma=1.2` лучшим в моем случае
def Adjust_gamma (изображение, гамма = 1,2):
    # построить таблицу поиска, отображающую значения пикселей [0, 255] в
    # их скорректированные значения гаммы
    invGamma = 1,0/гамма
    таблица = np.array([((i/255.0) ** invGamma) * 255
        для я в np.arange(0, 256)]).astype("uint8")
    # применяем гамма-коррекцию с помощью таблицы поиска
    вернуть cv2. LUT (изображение, таблица)
 

Вот результаты настройки гаммы:

Как видите, теперь он стал более… «сбалансированным». Без этого шага все параметры, которые вы будете выбирать вручную на последующих шагах, станут менее надежными!


На этом этапе мы будем адаптивно бинаризировать текстовые блобы. Я добавлю больше комментариев позже, но идея в основном следующая:

  • Мы делим изображение на блоков размером BLOCK_SIZE . Хитрость заключается в том, чтобы выбрать его размер достаточно большим, чтобы вы по-прежнему получали большой фрагмент текста и фона (т. местный»).
  • Внутри каждого блока мы выполняем локально-адаптивную бинаризацию: мы смотрим на медианное значение и предполагаем, что это фон (поскольку мы выбрали BLOCK_SIZE достаточно большим, чтобы большая его часть была фоном). Затем мы дополнительно определяем DELTA — в основном просто порог «насколько далеко от медианы мы все еще будем рассматривать его как фон?».

Итак, функция process_image выполняет свою работу. Кроме того, вы можете изменить preprocess и postprocess функции в соответствии с вашими потребностями (однако, как видно из приведенного выше примера, алгоритм довольно робастный , т. ).

Код этой части предполагает, что передний план темнее фона (т. е. чернила на бумаге). Но вы можете легко изменить это, настроив функцию предварительной обработки : вместо 255 - изображение , верните всего изображение .

 # Это пожалуй единственные важные параметры в
# весь конвейер (шаги с 0 по 3).
БЛОК_РАЗМЕР = 40
ДЕЛЬТА = 25
# Сделайте необходимую очистку от шума и другие вещи.
# Я просто делаю здесь простое размытие, но вы можете по желанию
# добавить больше материалов.
предварительная обработка по определению (изображение):
    изображение = cv2.medianBlur (изображение, 3)
    возврат 255 - изображение
# Опять же, этот шаг не является обязательным, и вы даже можете
# тело пустое.  Я только что сделал открытие. Алгоритм
# довольно надежен, так что этот материал не сильно повлияет.
деф постпроцесс (изображение):
    ядро ​​= np.ones ((3,3), np.uint8)
    изображение = cv2.morphologyEx (изображение, cv2.MORPH_OPEN, ядро)
    вернуть изображение
# Просто вспомогательная функция, которая генерирует координаты ящика
def get_block_index (image_shape, yx, block_size):
    y = np.arange(max(0, yx[0]-block_size), min(image_shape[0], yx[0]+block_size))
    x = np.arange(max(0, yx[1]-block_size), min(image_shape[1], yx[1]+block_size))
    вернуть np.meshgrid(y, x)
# Вот где начинается трюк. Выполняем бинаризацию из
# локальное значение медианы (img_in на самом деле является фрагментом изображения).
# Здесь выполняются следующие предположения:
# 1. Большинство пикселей в слайсе — это фон
№ 2. Среднее значение гистограммы интенсивности вероятно
# принадлежит фону. Мы допускаем мягкую маржу DELTA
# для учета любых нарушений.
# 3. Нам нужно сохранить все, кроме фона.
#
# Здесь мы также выполняем простые морфологические операции.  Это было просто
# что-то, что я эмпирическим путем нашел "полезным", но я предполагаю
# это довольно надежно для разных наборов данных.
определение адаптивного_медиан_порога (img_in):
    мед = np.median (img_in)
    img_out = np.zeros_like (img_in)
    img_out[img_in - средний < DELTA] = 255
    ядро ​​= np.ones ((3,3), np.uint8)
    img_out = 255 - cv2.dilate (255 - img_out, ядро, итерации = 2)
    вернуть img_out
# Эта функция просто делит изображение на локальные области (блоки),
# и выполняем функцию `adaptive_mean_threshold(...)` для каждого
# регионов.
def block_image_process (изображение, размер_блока):
    out_image = np.zeros_like (изображение)
    для строки в диапазоне (0, image.shape [0], block_size):
        для столбца в диапазоне (0, image.shape [1], block_size):
            idx = (строка, столбец)
            block_idx = get_block_index(image.shape, idx, block_size)
            out_image[block_idx] = адаптивный_медианный_порог(изображение[block_idx])
    вернуть out_image
# Эта функция вызывает весь конвейер шага 2. 
определение процесса_изображения (изображение):
    image_in = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    image_in = предварительная обработка (image_in)
    image_out = block_image_process (image_in, BLOCK_SIZE)
    image_out = постобработка (image_out)
    вернуть image_out
 

В результате получаются вот такие красивые капли, точно следующие за чернильным следом:


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

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

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

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

 # Эта функция используется для создания
определение сигмоида (x, ориг, рад):
 k = np.exp((x - исходное) * 5 / рад)
 вернуть k / (k + 1.)
# Здесь мы объединяем локальные блоки. Немного длинновато, пожалуйста
# следите за локальными комментариями.
def comb_block(img_in, маска):
 # Во-первых, мы предварительно заполняем замаскированную область img_out белым цветом
 # (т.е. фон). Маска получена из предыдущего раздела.
 img_out = np.zeros_like (img_in)
 img_out [маска == 255] = 255
 fimg_in = img_in.astype (np.float32)
 # Затем сохраняем передний план (буквы, написанные чернилами)
 # в массиве `idx`. Если их нет (т.е. просто фон),
 # переходим к следующему блоку.
 idx = np.where (маска == 0)
 если idx[0].shape[0] == 0:
 img_out[idx] = img_in[idx]
 вернуть img_out
 # Находим диапазон интенсивности наших пикселей в этой локальной части
 # и локально обрезать блок изображения по этому диапазону.
 lo = fimg_in[idx].min()
 привет = fimg_in[idx].max()
 v = fimg_in[idx] - ло
 р = привет - вот
 # Теперь мы используем старую добрую бинаризацию OTSU, чтобы получить приблизительную оценку
 # областей переднего плана и фона.
 img_in_idx = img_in[idx]
 ret3,th4 = cv2.threshold(img_in[idx],0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
 # Затем мы нормализуем материалы и постепенно применяем сигмовидную
 # Объедините продукты.
 bound_value = np.min (img_in_idx [th4 [:, 0] == 255])
 bound_value = (bound_value - lo) / (r + 1e-5)
 f = (v / (r + 1e-5))
 f = сигмоид (f, bound_value + 0,05, 0,2)
 # Наконец, мы повторно нормализуем результат в диапазоне [0. .255]
 img_out[idx] = (255. * f).astype(np.uint8)
 вернуть img_out
# Мы выполняем процедуру комбинирования на локальных блоках, так что масштабирование
# параметры сигмовидной функции можно настроить в соответствии с локальными настройками
def comb_block_image_process (изображение, маска, размер_блока):
 out_image = np.zeros_like (изображение)
 для строки в диапазоне (0, image.shape [0], block_size):
 для столбца в диапазоне (0, image.shape [1], block_size):
 idx = (строка, столбец)
 block_idx = get_block_index(image.shape, idx, block_size)
 out_image[block_idx] = comb_block(
 изображение[block_idx], маска[block_idx])
 вернуть out_image
# Постобработка (должна быть надежной и без нее, но я рекомендую
# вам нужно немного поиграть и найти то, что лучше всего подходит для ваших данных.
# Я просто оставил это поле пустым.
def comb_postprocess (изображение):
 вернуть изображение
# Основная функция этого раздела. Выполняет весь конвейер.