Как я могу деквантовать макроблоки в сильно сжатом изображении с помощью OpenCV?

Для сильно сжатого изображения (неспецифического формата) существуют блоки изображения разного размера и формы, в которых все пиксели имеют точно такое же значение.

Например:

Сильно сжатое изображение с блокировкой макросов

Моя цель состоит в том, чтобы «умно» сгладить эти блоки в градиенты, создавая более плавное и органично выглядящее изображение. Я видел приемы рисования (такие как диффузия тепла), которые могут быть применимы, хотя я не совсем уверен, как адаптировать их для моей цели. В настоящее время я пишу свою собственную функцию для выполнения этого действия (подробности ниже). Есть ли уже функция C++ в OpenCV (или где-либо еще), которая может выполнять этот процесс? Если нет, есть ли другой метод, отличный от того, который я использую, который может дать лучшие/более быстрые результаты?

[Примечание: все мои изображения перед обработкой конвертируются в формат с плавающей запятой.]

Моя текущая идея включает проверку того, идентичен ли пиксель любому из его соседей. Если это так, я начинаю поиск, начиная с местоположения пикселя и работая вовне, пока не будет найден неидентичный сосед. К сожалению, это требует, чтобы я использовал весь образ, а не скользящее ядро. Я не буду включать код поиска здесь, потому что он длинный и повторяющийся. Но по сути это включает в себя тестирование столбца слева, строки выше, столбца справа и строки ниже текущего пикселя и расширение их по мере того, как я работаю наружу. Как это:

  13 14 15 16 17
  12  3  4  5 18
  11  2  x  6 19
  10  1  7  8 20
  9  22 23 24 21

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

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

output_value = current_pixel_value - ((current_pixel_value-test_pixel_value)/(euclidean_distance*sigma));

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

Результат: Деквантованное изображение результата


person BHawk    schedule 12.03.2015    source источник


Ответы (1)


Документ Advanced Video Debanding Гэри Боуг и др. делает то, что вы делаете для чрезмерно сжатого видео. Базовый алгоритм также должен быть применим к неподвижному изображению. Может быть, это помогает.

person nils    schedule 12.03.2015
comment
Спасибо, это отлично. Он использует подход, очень похожий на тот, который использую я, но также вводит концепцию сглаживания градиентов после генерации, чтобы придать более естественный вид и предотвратить повторное квантование градиента дополнительными функциями записи. Я опубликую дополнительные результаты, как только внесу изменения. - person BHawk; 13.03.2015