Предварительная обработка изображения для обнаружения краев - низкое качество, низкая контрастность

У меня есть куча некачественных, малоконтрастных (обычно также плохого освещения) фотографий надписей на камнях. Я бы хотел, чтобы моя программа определяла формы букв (которые обычно довольно изношены). Поскольку я новичок, я пробовал применять фильтры Sobel / Laplacian / Canny, но фотографии явно нуждаются в предварительной обработке. Не могли бы вы подсказать, что я могу сделать, чтобы добиться лучших результатов. Я пробовал искать в Интернете, но решения, которые я нашел, либо не работают, либо кажутся мне волшебными.

Фото


person Karolina    schedule 20.01.2019    source источник
comment
Боюсь, что при известных методах фильтрации эта задача практически невыполнима. Надписи местами действительно бледные, и есть много мешающих элементов (дыры, царапины, трещины, случайное освещение ...). Даже неподготовленный человек не добьется результатов, которые можно использовать.   -  person Yves Daoust    schedule 22.01.2019
comment
Я работаю над подобными задачами, используя RTI imaging ulturalheritageimaging.org/Technologies/RTI см. Например. youtube.com/watch?v=Hw3rbYvN0h8 Я, конечно, понимаю, что это не прямой помочь вам, к сожалению.   -  person jcupitt    schedule 22.01.2019
comment
@Karolina Как предлагали другие, ваши обнаружения будут настолько хороши, насколько хороши ваши данные. Вы можете попробовать несколько методов обработки изображений (пример здесь), но с обесцвеченными / переэкспонированными областями далеко не уедешь, и это сложно автоматизировать. Я бы также попытался вручную отследить буквы настолько хорошо, насколько позволяет ваше зрение (и, может быть, подумайте, какие функции изображения позволили вам отследить символы)?   -  person George Profenza    schedule 22.01.2019


Ответы (1)


Эта проблема требует полного алгоритма. За исключением написания полного кода на MATLAB / Octave или Python / C ++ с использованием OpenCV, вот мои два цента на то, как, возможно, я буду это делать.

  1. Текст на этом изображении вырезан в скале. Я хотел бы сначала улучшить контраст изображения с помощью некоторого выравнивания гистограммы. Это должно сделать текст более заметным. (Подсказка: проверьте calcHist() и equalizeHist() в opencv или imhist() и adapthisteq() в MATLAB.)

  2. Я бы удалил ненужные части изображения.

    1. Удалите все, что не является камнем.

      1. For this one would remove everything which is not the rock. That means, removing the part of the image near the top, which is darker mostly. You could do a black&white thresholding on the image and then apply the Hough-Transform to detect the largest horizontal line or nearly horizontal line in the image.
      2. Подобным образом я бы попытался обнаружить край камня под углом 45 °.
      3. Удалите все, что находится выше этих двух строк, с помощью двоичное маскирование.
      4. В результате у вас должно получиться обрезанное изображение, что-то похожее на это. (Подсказка: см. cv2.HoughLines как объяснено здесь или houghlines в Matlab, как описано здесь.)

        Чтобы уточнить, что я имею в виду,  введите описание изображения здесь

    2. Затем я удалил острые края в правом нижнем углу камня. На мой взгляд, это можно сделать одним из двух способов.

      • Those edges look very fine and sharp. That means, high frequency components. Actually, those appear to be the highest frequency components in the whole image. So either you take the fft() function from MATLAB or the cv2.idft from opencv and transform the image into the frequency domain and remove all frequency components above a certain frequency threshold. (What that threshold is, I cannot say. One has to test and see. Be careful not to set the threshold too low or you could lose the sharpness of your text also.). Transform back the modified image back from the frequency domain.
      • В качестве альтернативы и проще, вы можете размыть изображение, используя imgausfilt из MATLAB или cv2.filter2D из opencv. Размер фильтра / ядра, используемого с этими функциями, имеет значение. Слишком большой, и вы теряете слишком много деталей.
      • Это должно сгладить острые края внизу. (Примечание: изображение предназначено только для иллюстрации. Сглаживание, конечно, повлияет на все изображение. Поэтому лучше всего сохранить сглаживание настолько, чтобы удалить эти тонкие края, чтобы они не выступали во время кромки. шаг обнаружения.)  введите описание изображения здесь
  3. Теперь, когда удалены большие части «неинтересных» участков изображения, вы можете применить некоторый алгоритм обнаружения краев (например, Canny, как вы сами упомянули) к вашему пороговому черно-белому изображению, и, надеюсь, у вас должно быть больше текста. Эквивалентные функции для обнаружения краев существуют как в OpenCV, так и в MATLAB.

ЗАДАЧИ: Конечно, маленькие кружочки между текстом по-прежнему являются проблемой, и алгоритм можно улучшить (например, чтобы сопоставить формы, такие как круги, а затем), удалить их также. Кроме того, как восстановить поврежденные части текста из этого изображения, вероятно, немного сложнее (по крайней мере, для меня).

  1. Наконец, вы можете использовать распознавание OCR, например, с помощью tesseract и OpenCV, вы можете попробовать извлечь текст из обработанного изображения.
person Duck Dodgers    schedule 21.01.2019
comment
OCR с треском провалится. - person Yves Daoust; 03.02.2019
comment
@YvesDaoust, в этом само по себе, да, OCR не добьется многого. Я говорил об использовании OCR для обработанных изображений после шагов 1,2 и 3. - person Duck Dodgers; 04.02.2019
comment
Я тоже это имел в виду. После предварительной обработки OCR продолжит сбой. - person Yves Daoust; 04.02.2019
comment
И что бы вы посоветовали решить эту проблему? - person Duck Dodgers; 04.02.2019
comment
Просто признай, что это невозможно. - person Yves Daoust; 04.02.2019