У меня есть куча некачественных, малоконтрастных (обычно также плохого освещения) фотографий надписей на камнях. Я бы хотел, чтобы моя программа определяла формы букв (которые обычно довольно изношены). Поскольку я новичок, я пробовал применять фильтры Sobel / Laplacian / Canny, но фотографии явно нуждаются в предварительной обработке. Не могли бы вы подсказать, что я могу сделать, чтобы добиться лучших результатов. Я пробовал искать в Интернете, но решения, которые я нашел, либо не работают, либо кажутся мне волшебными.
Предварительная обработка изображения для обнаружения краев - низкое качество, низкая контрастность
Ответы (1)
Эта проблема требует полного алгоритма. За исключением написания полного кода на MATLAB / Octave или Python / C ++ с использованием OpenCV, вот мои два цента на то, как, возможно, я буду это делать.
Текст на этом изображении вырезан в скале. Я хотел бы сначала улучшить контраст изображения с помощью некоторого выравнивания гистограммы. Это должно сделать текст более заметным. (Подсказка: проверьте
calcHist()
иequalizeHist()
в opencv илиimhist()
иadapthisteq()
в MATLAB.)Я бы удалил ненужные части изображения.
Удалите все, что не является камнем.
- 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.
- Подобным образом я бы попытался обнаружить край камня под углом 45 °.
- Удалите все, что находится выше этих двух строк, с помощью двоичное маскирование.
В результате у вас должно получиться обрезанное изображение, что-то похожее на это. (Подсказка: см.
cv2.HoughLines
как объяснено здесь илиhoughlines
в Matlab, как описано здесь.) em>
Затем я удалил острые края в правом нижнем углу камня. На мой взгляд, это можно сделать одним из двух способов.
- 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 thecv2.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. Размер фильтра / ядра, используемого с этими функциями, имеет значение. Слишком большой, и вы теряете слишком много деталей. - Это должно сгладить острые края внизу. (Примечание: изображение предназначено только для иллюстрации. Сглаживание, конечно, повлияет на все изображение. Поэтому лучше всего сохранить сглаживание настолько, чтобы удалить эти тонкие края, чтобы они не выступали во время кромки. шаг обнаружения.)
- 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
Теперь, когда удалены большие части «неинтересных» участков изображения, вы можете применить некоторый алгоритм обнаружения краев (например, Canny, как вы сами упомянули) к вашему пороговому черно-белому изображению, и, надеюсь, у вас должно быть больше текста. Эквивалентные функции для обнаружения краев существуют как в OpenCV, так и в MATLAB.
ЗАДАЧИ: Конечно, маленькие кружочки между текстом по-прежнему являются проблемой, и алгоритм можно улучшить (например, чтобы сопоставить формы, такие как круги, а затем), удалить их также. Кроме того, как восстановить поврежденные части текста из этого изображения, вероятно, немного сложнее (по крайней мере, для меня).
- Наконец, вы можете использовать распознавание OCR, например, с помощью tesseract и OpenCV, вы можете попробовать извлечь текст из обработанного изображения.