Удаление цвета HSV / выпадение полей формы

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

У меня есть 2 изображения: 1 цветное изображение (преобразованное в цветовое пространство HSV) и 1 черно-белое изображение, которые выстраиваются в пиксель на пиксель (они создаются сканером)

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

У меня есть преимущество в том, что я априори знаю точное местоположение поля и ширину / высоту границ поля.

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

Если значение Delta между "текущим" пикселем и средним значением HSV меньше 0,07 (найдено эмпирически), тогда я устанавливаю пиксель на белый (цвета близки друг к другу), в противном случае я оставляю пиксель черным.

Вот несколько примеров поля:

Цветное изображение:Черно-белое изображение без выпадения:Вычеркнуто черно-белое изображение, где насыщение не используется в уравнении:Фактическое выпавшее черно-белое изображение с формулой, использованной полностью (с использованием всех 3 компонентов H,S & V)

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

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

Каковы ваши мысли, чтобы смягчить некоторые изменения цвета (насыщенности), которые происходят в пределах границы поля, это использовать гистограммы? с некоторым квантованием там, чтобы уменьшить количество бинов?

Я хотел бы услышать любые идеи, которые люди имеют.

Спасибо.

2 ответа

Я не уверен, что полностью понимаю ваши приоритеты здесь - третье изображение выглядит довольно хорошо для меня (намного лучше, чем четвертое). Я заметил, что в нижней части первого "S" есть пробел.

В любом случае, поскольку вы знаете положение границ и сканируете эти пиксели, я предлагаю составить статистику по H, S и V для них. Для S и V I предположим, что вы можете просто рассчитать среднее и стандартное отклонение. Оттенок сложнее из-за закругления углов и того, что он может быть неопределенным. Вы можете просто квантовать и найти режим (или режим взвешивания по окну). Вы можете сделать то же самое для небелого содержимого блоков, чтобы вы могли количественно определить характер штрихов пера по сравнению с пикселями блока. To narrow your distributions you could discard any pixels that fall outside x SD as outliers and recalculate the mean and SD. From that point you could simply classify a pixel based upon which probability distribution it falls closer to being within.

Optimizations to that would include:

  • Ignore the H component for low saturations.
  • When unsure, bias towards border if near known border locations.
  • When unsure, run a second pass that biases towards pen strokes if there are neighbouring pixels classified already as pen strokes.

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

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

OpenCV предоставляет реализации SVM и градиентные возможности (дескрипторы), если вы знакомы с C++ или Python:

В качестве альтернативы Matlab предоставляет код для обучения SVM, а также для вычисления функций градиента.

Другие вопросы по тегам