【问题标题】:Algorithm to zoom images clearly清晰缩放图像的算法
【发布时间】:2013-06-04 20:12:45
【问题描述】:

我知道图像可以在图像金字塔的帮助下进行缩放。而且我知道 opencv pyrUp() 方法可以缩放图像。但是,在一定程度上,图像变得不清晰。举个例子,如果我们把一张小图放大 15 倍原来的大小,肯定是不清晰的。

OpenCV 中是否有任何方法可以缩放图像但保持原始图像中的间隙?或者,有什么算法可以做到这一点?

【问题讨论】:

  • 一般来说,没有。因为这需要原始图像中不可用的信息。
  • 你无法从 2 加仑的桶中取出 10 加仑的水。如果信息不存在,就无法从无到有地创建它。你一直在看太多 CSI。
  • @LeeDanielCrocker 放大和增强!
  • 您可以使用具有质量 BiCubic 的 OpenCVs Resize Method

标签: c++ image algorithm math image-processing


【解决方案1】:

您很可能希望为您的图像尝试不同的插值方案。 OpenCV 提供了resize 函数,可用于各种不同的插值方案(docs)。您可能会在模糊度(例如,在双三次或双线性插值方案中)与锯齿状混叠效果(例如,在最近邻插值中)之间进行权衡。我建议您尝试使用它提供的不同方案,看看哪些方案能给您带来最好的结果。

支持的插值方案如下:

INTER_NEAREST nearest-neighbor interpolation
INTER_LINEAR bilinear interpolation (used by default)
INTER_AREA resampling using pixel area relation. It may be the preferred method
   for image decimation, as it gives moire-free results. But when the image is
   zoomed, it is similar to the INTER_NEAREST method
INTER_CUBIC bicubic interpolation over 4x4 pixel neighborhood
INTER_LANCZOS4 Lanczos interpolation over 8x8 pixel neighborhood

Wikimedia commons 为最近邻、双线性和双三次插值提供了这张漂亮的比较图像:

您可以看到缩放时不太可能获得与原始图像相同的清晰度,但您可以权衡“平滑度”以换取锯齿效果(即锯齿状边缘)。

【讨论】:

  • 哇。谢谢。我真的很感谢你的帮助。特别感谢您指出我可以尝试的方法
【解决方案2】:

要记住的一件事:您不能凭空获得额外的分辨率。当你放大图像时,你可以得到一个模糊、平滑的图像,或者你可以得到一个清晰、块状的图像,或者你可以介于两者之间。更好的算法,似乎对特定类型的主题有更好的性能,对图像的内容做出某些假设,如果为真,可以产生更高的表观性能,但如果这些假设被证明是错误的,则会搞砸;您正在用准确性换取锐度。

有几种很好的算法可以缩放特定类型的主题,包括pixel art, 面孔或文字。 用于锐化图像的更通用算法包括不锐化遮罩、边缘增强等,但是所有这些都假设图像内容的特定事物,例如,图像包含文本,或者嘈杂​​区域仍然是嘈杂的(或不)以更高的分辨率。

低分辨率的圆点图案或沙滩的砂砾图案不会很好地处理,计算机可能会将您的海景变成更让人联想到 mosh 坑的东西。每个缩放算法或锐化滤镜都有许多与之相关的成本。

为了正确选择缩放或锐化算法,绝对需要更多上下文,包括示例图像。

【讨论】:

    【解决方案3】:

    你的问题来自这个宇宙物理学:原始图像中根本没有足够的位来表示 15*15 倍的细节。任何算法都无法发明不存在的“正确信息”。它可以找到一个合适的插值。但它永远不会增加细节。

    尽管在许多警察小说中都会发生这种情况,但从城市全景中获取车门把手上的指纹照片绝对是假的。

    【讨论】:

      【解决方案4】:

      OpenCV 有Super Resolution module。我还没有机会尝试它,所以不太确定它的效果如何。

      你应该看看Super-Resolution From a Single Image:

      超分辨率 (SR) 方法可以大致分为两类方法:(i) 经典的多图像超分辨率(组合在亚像素未对齐处获得的图像),以及 (ii) 基于示例的超分辨率分辨率(从数据库中学习低分辨率和高分辨率图像块之间的对应关系)。在本文中,我们提出了一个统一的框架来结合这两种方法。

      【讨论】:

        【解决方案5】:

        看看quick image scaling algorithms

        首先,我将讨论一个简单的算法,称为“平滑 Bresenham”,它可以最好地描述为使用 Bresenham 算法在缩放网格上进行最近邻插值。该算法速度快,产生与线性插值相当的质量,并且可以上下缩放,但仅适用于较小范围内的缩放因子。为了抵消这一点,我接下来开发了一种方向插值算法,它只能放大(放大)并且只能放大 2 倍,但这样做的方式是保持边缘锐利。这种定向插值方法比平滑的 Bresenham 算法慢很多,因此在计算后缓存那些 2× 图像是实用的。缓存相对大小为 2 次方的图像,结合简单的插值,实际上是第三种图像缩放技术:MIP 映射。

        一个相关的问题是Image scaling and rotating in C/C++。另外,您可以使用CImpg

        【讨论】:

          【解决方案6】:

          您可以使用以下两个函数在opencv中轻松zoom inzoom out图像。

          放大

          pyrUp(tmp, dst, Size(tmp.cols * 2, tmp.rows * 2));
          

          缩小

          pyrDown(tmp, dst, Size(tmp.cols / 2, tmp.rows / 2));
          

          您可以在以下链接中获取有关该方法的详细信息:

          Image Zoom Out and Zoom In using OpenCV

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-03-05
            • 2015-04-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-26
            相关资源
            最近更新 更多