c++ - 如何使用 OpenCV 在高度压缩的图像中添加 "dequantize"宏 block ?

标签 c++ opencv image-processing compression image-compression

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

例如:

Highly compressed image with "macro blocking"

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

[注意:我所有的图像在处理之前都被转换为 float 。]

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

  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

获取目标后,会额外考虑搜索范围较大但欧氏距离较小的目标。

如果色差在可接受的范围内,我再计算最近的不相同邻居的欧氏距离,并根据欧氏距离和两个不相同像素之间的色差计算一个像素值。我还使用用户设置的 sigma 值来影响渐变的衰减。

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

此方法工作“正常”,但在具有巨大宏 block 的图像中速度较慢,并且输出仍然具有“带状”外观。 (参见墙壁、地板等的“白色”部分)。

结果: "Dequantized" result image

最佳答案

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

关于c++ - 如何使用 OpenCV 在高度压缩的图像中添加 "dequantize"宏 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29020057/

相关文章:

python - cv2中的可变fps(每秒帧数)

python - SimpleBlobDetector opencv python错误但缺少输出

c++ - 在 OS X 上安装 C++ 库

python-3.x - 为什么不能在 OpenCV (Python) 中使用 `cv2.cv.BoxPoints`?

c++ - 使用CMake在特定于应用程序的子文件夹中查找依赖项

c++ - 如何将串口传入数据写入文本文件(.txt)

c++ - 如何在 XCode 中使用链接器标志链接 File.framework 文件?

actionscript-3 - 上传前给图片添加水印? AS3 + 柔性

c++ - Visp 库 - 如何调整图像大小

c++ - 出队不适用于从双链表继承的队列类