Подтвердить что ты не робот

Какие шаги обработки следует использовать для очистки фотографий чертежей?

Мой обычный метод 100% -ной контрастности и некоторая регулировка яркости для настройки точки отсечки обычно работают достаточно хорошо, чтобы очистить фотографии небольших подсхем или уравнений для публикации на E & R.SE, однако иногда это не совсем так, как с этим изображением:

alt text

Какие другие методы помимо контраста (или вместо) можно использовать для получения более последовательного вывода?

Я ожидаю довольно общий ответ, но я, вероятно, воспользуюсь им в script (который я могу просто записать в файл) с помощью ImageMagick и/или PIL (Python), поэтому, если у вас есть что-то конкретное для них он был бы рад.

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

4b9b3361

Ответ 1

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

from PIL import Image
from PIL import ImageFilter
im = Image.open(r'c:\temp\temp.png')
white = im.filter(ImageFilter.BLUR).filter(ImageFilter.MaxFilter(15))

alt text Следующим шагом является создание изображения в оттенках серого на входе RGB. Масштабируя до белой точки, мы исправляем проблемы с балансом белого. Взяв максимум R, G, B, мы преуменьшаем любой цвет, который не является чисто серым, например синие линии сетки. Первая строка кода, представленная здесь, является фиктивной, для создания изображения правильного размера и формата.

grey = im.convert('L')
width,height = im.size
impix = im.load()
whitepix = white.load()
greypix = grey.load()
for y in range(height):
    for x in range(width):
        greypix[x,y] = min(255, max(255 * impix[x,y][0] / whitepix[x,y][0], 255 * impix[x,y][1] / whitepix[x,y][1], 255 * impix[x,y][2] / whitepix[x,y][2]))

Результатом этих операций является изображение, которое имеет в основном постоянные значения и может быть преобразовано в черно-белое с помощью простого порогового значения. alt text


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

Моя попытка воссоздать этот подход привела к следующему:

for y in range(height):
    for x in range(width):
        greypix[x,y] = min(255, max(255 + impix[x,y][0] - whitepix[x,y][0], 255 + impix[x,y][1] - whitepix[x,y][1], 255 + impix[x,y][2] - whitepix[x,y][2]))

alt text

Я работаю над сочетанием методов, чтобы добиться еще лучшего результата, но он еще не совсем готов.

Ответ 2

Одним из распространенных способов удаления различной фоновой подсветки является вычисление "белого изображения" изображения, opening изображения.

В этом примере кода Octave я использовал синий канал изображения, потому что линии в фоновом режиме наименее заметны в этом канале ( EDITED: использование кругового элемента структурирования создает меньше визуальных артефакты, чем простая коробка):

src = imread('lines.png');
blue = src(:,:,3);
mask = fspecial("disk",10);
opened = imerode(imdilate(blue,mask),mask);

Результат: opened

Затем вычтите это из исходного изображения:

background_subtracted = opened-blue;

background_subtracted (улучшенная контрастность)

Наконец, я просто бинаризую изображение с фиксированным порогом:

binary = background_subtracted < 35;

binary

Ответ 3

Как насчет обнаружение краев? Это должно подобрать линейные чертежи.

Здесь результат обнаружения края Sobel на вашем изображении:

alt text

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

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

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