如何使用 OpenCV 在高度压缩的图像中 "dequantize" 宏块?

How can I "dequantize" macro blocks in a highly compressed image using OpenCV?

给定一个高度压缩的图像(非特定格式),存在各种大小和形状的图像块,其中所有像素都具有完全相同的值。

例如:

我的目标是 "intelligently" 将这些块平滑成渐变,从而产生更平滑、更自然的图像。我已经看到了可能适用的绘画内技术(例如热扩散),但我不完全确定如何根据我的目的调整它们。我目前正在编写自己的函数来执行此操作(详情如下)。 OpenCV(或其他地方)中是否已经有可以执行此过程的 C++ 函数?如果不是,是否有与我使用的方法不同的方法可能会产生 better/faster 结果?

[注意:我所有的图片在处理之前都被转换为浮点数。]

我目前的想法是测试一个像素是否与其相邻像素相同。如果是这样,我开始从像素位置开始搜索并向外搜索,直到找到一个不相同的邻居。不幸的是,这要求我使用整个图像而不是滑动内核。我不会在此处包括搜索代码,因为它很长且重复。但它本质上涉及测试当前像素左侧的一列、上方的一行、右侧的一列和下方的一行,并在我向外工作时扩展它们。像这样:

  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));

此方法有效 "ok" 但在具有巨大宏块的图像中速度较慢并且输出仍然具有 "banded" 外观。 (参见 "white" 部分墙壁、地板等)。

结果:

Gary​​ Baugh 等人的论文 Advanced Video Debanding。做你为过度压缩的视频做的事情。底层算法也应该适用于静止图像。也许有帮助。