Для сильно сжатого изображения (неспецифического формата) существуют блоки изображения разного размера и формы, в которых все пиксели имеют точно такое же значение.
Например:
Моя цель состоит в том, чтобы «умно» сгладить эти блоки в градиенты, создавая более плавное и органично выглядящее изображение. Я видел приемы рисования (такие как диффузия тепла), которые могут быть применимы, хотя я не совсем уверен, как адаптировать их для моей цели. В настоящее время я пишу свою собственную функцию для выполнения этого действия (подробности ниже). Есть ли уже функция 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));
Этот метод работает «хорошо», но он работает медленно на изображениях с огромными макроблоками, а вывод по-прежнему имеет «полосатый» вид. (См. «белые» участки стен, полов и т. д.).
Результат: