Использование PIL для обнаружения сканирования пустой страницы - PullRequest
5 голосов
/ 25 марта 2011

Так что я часто выполняю огромные задания двустороннего сканирования на неинтеллектуальной многофункциональности Canon, что оставляет меня с огромной папкой в ​​формате JPEG.Не могу ли я подумать об использовании PIL для анализа папки изображений, чтобы обнаружить сканы пустых страниц и пометить их для удаления?

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

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

Я знаю, что это своего рода крайний случай, но любой человек с опытом PIL может датьнекоторые указатели?

Ответы [ 3 ]

12 голосов
/ 01 апреля 2011

Вот альтернативное решение, использующее mahotas и milk .

  1. Начните с создания двух каталогов: positives/ и negatives/, где вывручную выберут несколько примеров.
  2. Я буду предполагать, что остальные данные находятся в unlabeled/ каталоге
  3. Вычислить функции для всех изображений в позитивах и негативах
  4. выучить классификатор
  5. использовать этот классификатор на немаркированных изображениях

В приведенном ниже коде я использовал jug , чтобы дать вам возможность запустить его нанесколько процессоров, но код также работает, если вы удаляете каждую строку, в которой упоминается TaskGenerator

from glob import glob
import mahotas
import mahotas.features
import milk
from jug import TaskGenerator


@TaskGenerator
def features_for(imname):
    img = mahotas.imread(imname)
    return mahotas.features.haralick(img).mean(0)

@TaskGenerator
def learn_model(features, labels):
    learner = milk.defaultclassifier()
    return learner.train(features, labels)

@TaskGenerator
def classify(model, features):
     return model.apply(features)

positives = glob('positives/*.jpg')
negatives = glob('negatives/*.jpg')
unlabeled = glob('unlabeled/*.jpg')


features = map(features_for, negatives + positives)
labels = [0] * len(negatives) + [1] * len(positives)

model = learn_model(features, labels)

labeled = [classify(model, features_for(u)) for u in unlabeled]

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

4 голосов
/ 25 марта 2011

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

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

2 голосов
/ 25 марта 2011

Несколько предложений, не относящихся к PIL, для рассмотрения:

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

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

В случае, если освещение или сама страница неоднородны, вы можете начать делать что-то вроде image = image-filter(image), где filter делает очень широкое сглаживание некоторого вида.Это уменьшит необходимость определения доминирующих оттенков, а также поможет справиться с ситуацией, когда доминирующий оттенок не совсем однороден по всей странице.

...