我知道图像可以通过图像金字塔进行缩放。而且我知道opencv的pyrUp()
方法可以缩放图像。但是,到一定程度后,图像变得不清晰。例如,如果我们将一个小图像放大15倍,那么它肯定不清晰。
在OpenCV中是否有任何方法可以缩放图像但保持与原始图像相同的清晰度?或者,有没有算法可以做到这一点?
我知道图像可以通过图像金字塔进行缩放。而且我知道opencv的pyrUp()
方法可以缩放图像。但是,到一定程度后,图像变得不清晰。例如,如果我们将一个小图像放大15倍,那么它肯定不清晰。
在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
OpenCV拥有超分辨率模块。我还没有试过它,所以不太确定它的表现如何。
你应该看看从单个图像实现超分辨率:
超分辨率(SR)方法可以广泛地分为两类方法:(i)经典的多图像超分辨率(组合在子像素错位处获得的图像),和(ii)基于示例的超分辨率(从数据库中学习低分辨率和高分辨率图像补丁之间的对应关系)。在本文中,我们提出了一个统一的框架来结合这两类方法。
你所要求的内容涉及到宇宙物理学:原始图像中没有足够的位来表示15*15倍的细节。无论什么算法都无法创造不存在的“正确信息”。它只能找到合适的插值方法。但它永远不会增加细节。
尽管在许多警匪小说中会发生这种事情,但是从城市全景图中获取车门把手上指纹的照片是绝对的虚假。
For Zoom In
pyrUp(tmp, dst, Size(tmp.cols * 2, tmp.rows * 2));
pyrDown(tmp, dst, Size(tmp.cols / 2, tmp.rows / 2));