Как лучше всего подходить к локализованной функции OpenGL пороговой - PullRequest
4 голосов
/ 29 декабря 2011

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

Вот пример. Сверху оригинальное изображение. Внизу находится обработанные изображения.

enter image description here

[редактировать] Я добавил в лучший пример картину того, что происходит. Я могу улучшить текст, но в областях, где у меня нет текста, это простое пороговое значение создает пестрый шум (изображение внизу слева). Если я сверну порог, я потеряю текст в более темной области (справа внизу).

В данный момент обработанное изображение воспринимает только часть текста, а не весь текст. Исходный алгоритм, который я использовал, был довольно прост: - выборка 8 пикселей вокруг текущего пикселя (кажется, что пиксели, расположенные на расстоянии около 4-5, работают лучше всего) - выяснить самые светлые и самые темные пиксели из этого образца - если текущий пиксель ближе к самому темному порогу, то сделать черным, и наоборот

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

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

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

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

Один из способов справиться с тенями - это пробежать высокопройти фильтр перед установкой.

Вот как вы это делаете в редакторе изображений (вручную, без плагина высокочастотного фильтра):
1. Преобразование изображения в оттенки серого и сохранение его в «layer_A»
2. сделать копию «layer_A» в «Layer_B»
3. Инвертировать цвета в «Layer_B»
4. Гауссово размытие «Layer_B» с радиусом, который больше, чем самый большой объект, который вы хотите сохранить.(радиус размытия больше, чем буква)
5. Объедините «Layer_A» с «Layer_B», где result = "Layer_A" * 0.5 + "Layer_B" * 0.5.
6. Увеличьте контрастность получаемого изображения.
7. Выполните порог.


Example

В opengl это будет сделано таким же образом (и без нескольких слоев)

Не будет хорошо работать с сильным / четкимтени (очевидно), но это уничтожит огромные гладкие тени, возникающие из-за изгиба страницы и т. д.

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

Кстати, если вы хотите улучшить «читабельность»затем вы можете оставить его в градациях серого (при улучшении контраста) вместо преобразования его в «черно-белый» (1-битный цвет).Острые края букв затрудняют чтение текста.

1 голос
/ 01 января 2012

спасибо за вашу помощь.

В итоге я выбрал довольно простой подход.
Взяв выборку из 8 соседних пикселей, определив максимальное и минимальное значения.Определяется локальный порог (max - min).Тогда

smooth = dot(vec3(1.0/3.0), smoothstep(currentMin, currentMax, p11).rgb);
smooth = (localthreshold < threshold) ? 1.0 : smooth;
return vec4(smooth, smooth, smooth, 1);

Это не показывает мне текст хорошо в темной и светлой областях, что является идеальным, но это хорошо очищает текст в более светлой области.

Майк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...