算法以清晰方式缩放图像

4

我知道图像可以通过图像金字塔进行缩放。而且我知道opencv的pyrUp()方法可以缩放图像。但是,到一定程度后,图像变得不清晰。例如,如果我们将一个小图像放大15倍,那么它肯定不清晰。

在OpenCV中是否有任何方法可以缩放图像但保持与原始图像相同的清晰度?或者,有没有算法可以做到这一点?


3
一般来说,不行。因为这需要原始图像中没有的信息。 - Oliver Charlesworth
2
你不能从一个2加仑的桶里取出10加仑的水。如果信息不在那里,就没有办法从无中创造它。你看太多CSI了。 - Lee Daniel Crocker
2
@LeeDanielCrocker 放大并增强! - Timothy Shields
1
你可以使用OpenCV的Resize方法,并选择质量为BiCubic。 - Andreas
6个回答

8

需要记住的一件事情:你无法从虚无中拉出额外的分辨率。当你放大一张图片时,你可以得到模糊、平滑的图像,或者是锐利、方块状的图像,或者介于两者之间。更好的算法对于特定类型的主题似乎具有更好的性能,但是它们对图像内容做出了某些假设,如果这些假设证明是错误的,就会破坏其表现力,因此你正在用精度来换取锐度。

有几种针对特定类型的主题进行缩放的好算法,包括像素艺术、面部或文本。更通用的图像锐化算法包括非锐化掩蔽、边缘增强等,然而所有这些算法都对图像内容做出了特定的假设,例如图像包含文本,或者噪声区域在更高的分辨率下仍然保持噪声(或不保持)。

低分辨率的波点图案或沙滩的砂粒图案将不会很好地呈现,计算机可能会将你的海景变成更像摇滚乐现场的东西。每个缩放算法或锐化滤镜都有许多相关的成本。

为了正确选择缩放或锐化算法,需要更多的上下文信息,包括样本图像是绝对必要的。

4
您可能希望尝试不同的图像插值方案。OpenCV提供了resize函数,可与各种不同的插值方案一起使用(文档)。您很可能会在模糊(例如双三次或双线性插值方案)和锯齿状混叠效应(例如最近邻插值)之间进行权衡。我建议尝试使用它提供的不同方案,并查看哪些方案能给您带来最佳结果。
支持的插值方案如下:
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

维基共享资源提供了这个最近邻插值、双线性插值和双三次插值的比较图像: Different interpolation schemes 您可以看到,当放大时,您不太可能获得与原始图像相同的锐度,但是您可以在“平滑度”和混叠效应(即锯齿状边缘)之间进行权衡。

哇,谢谢。我真的感激你的帮助。特别感谢你指出了我可以尝试的内容。 - PeakGen

4

OpenCV拥有超分辨率模块。我还没有试过它,所以不太确定它的表现如何。

你应该看看从单个图像实现超分辨率

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


3
请看快速图像缩放算法
首先,我将讨论一个简单的算法,称为“平滑Bresenham”,它最好的描述是在缩放的网格上使用Bresenham算法进行最近邻插值。该算法快速,产生与线性插值相当的质量,并且可以放大和缩小,但仅适用于相对较小的缩放因子。为了抵消这一点,我接下来开发了一种方向插值算法,它只能放大(缩放),而且只能以2×的因子进行放大,但是它以保持边缘清晰的方式进行放大。这种方向插值方法比平滑Bresenham算法要慢得多,因此,在计算后缓存那些2×图像是可行的。缓存相对大小为2的幂次的图像,结合简单的插值,实际上是第三种图像缩放技术:MIP映射。
相关问题请参见C/C++中的图像缩放和旋转。此外,您可以使用CImpg

2

你所要求的内容涉及到宇宙物理学:原始图像中没有足够的位来表示15*15倍的细节。无论什么算法都无法创造不存在的“正确信息”。它只能找到合适的插值方法。但它永远不会增加细节。

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


1
你可以使用以下两个函数在OpenCV中轻松地放大或缩小图像。
放大图像:

For Zoom In

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

缩小页面
pyrDown(tmp, dst, Size(tmp.cols / 2, tmp.rows / 2));

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

使用OpenCV进行图像缩放


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接