4

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

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

4

6 回答 6

8

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

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

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

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

于 2013-06-08T18:39:53.407 回答
4

OpenCV 有超分辨率模块。我还没有机会尝试它,所以不太确定它的效果如何。

您应该查看来自单个图像的超分辨率

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

于 2013-06-09T11:47:10.130 回答
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

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

不同的插值方案

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

于 2013-06-08T18:30:29.817 回答
3

看看快速图像缩放算法

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

一个相关的问题是C/C++ 中的图像缩放和旋转。此外,您可以使用CImpg

于 2013-06-09T13:16:34.903 回答
2

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

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

于 2013-06-08T18:42:40.173 回答
1

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

放大

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

缩小

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

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

使用 OpenCV 缩小和放大图像

于 2016-06-25T08:01:41.603 回答