使用OpenCV增加图像比例和最大化分辨率?

4
我刚刚开始学习OpenCV,看了一些类似的问题,但没有找到有用的答案。我有许多像素尺寸为50宽50高(缩略图大小)的图像。
我对以下内容有点困惑:
问:通过增加这些图像的比例,我是否自动增加了分辨率?还是需要执行另一个功能?
在增加图像的比例的同时获得最大分辨率对我来说至关重要。
我正在使用以下功能:
int IncreaseScale()
{
  char *image_name {"./image/my_image.jpg"};
  cv::Mat Image;
  Image = cv::imread(image_name, 1);
  if(!Image.data)
  {
    //Cant find image
    return 0;
  }
  const float rescale_value {4.10}; 
  cv::Mat Image2;
  cv::resize(Image, Image2, cvSize(0, 0), rescale_value, rescale_value);
  return 1;
}

1
假设您在两个维度上都按2的因子进行调整大小。您只知道1/4像素的真实值。您需要“猜测”其余像素的值。这称为“插值”。您可以选择不同类型的插值作为调整大小函数的最后一个参数。所以,不,您并没有增加分辨率...只是尽可能填补空洞。 - Miki
谢谢@Miki - 有什么技巧可以用来提高分辨率吗? - Babra Cunningham
2个回答

6

正如这里的人们之前所说,当增加图像的大小时,使用插值方法的能力很有限。在增加图像的分辨率时,您使用了先前分辨率的像素来猜测它们的值。虽然图像分辨率将会更高,但它的质量并不会更好。

一种克服此问题的技术是所谓的超分辨率。其思想是,在观察场景时,拍摄多个不同视角的图像。每个图像提供了其他图像未见过的一些微小信息差异。您确定每个视角的独特之处,然后将这些信息组合在一起,生成更高质量的增强图像流。但遗憾的是,单个图像无法实现此目标,因为没有额外的信息可从图像流中提取。但是,您可以使用相同视点的多个图像。引入到相机传感器中的噪声剖面应足以为超分辨率算法提供不同的信息,以生成更高质量的放大图像。事实上,超分辨率的想法是通过将它们的信息组合成最终图像来获取“低质量”的多个图像,并创建高质量的结果。这个想法已经存在一段时间了,不仅与图像处理有关,而且在科学中的各种显微镜和成像领域也有应用。
仅使用单个图像进入人工创建超分辨率图像的领域,这取决于图像可能或不可能有效。使用一系列图像将具有更高的成功概率。您可以在此处阅读有关超分辨率的更多详细信息:http://www.infognition.com/articles/what_is_super_resolution.html 幸运的是,OpenCV确实有一个实现超分辨率的模块,它位于Super Resolution module中。您需要输入一系列图像,输出将是一系列所需更高分辨率的更高质量的图像。
在OpenCV的Github存储库中可以找到如何使用超分辨率模块的代码示例: https://github.com/opencv/opencv/blob/master/samples/gpu/super_resolution.cpp。不要被源代码的位置所迷惑。尽管它被放置在GPU示例下,但代码被设计为处理CPU和GPU情况,正如您可以在if语句中看到的那样。该代码接收视频流,并输出基于超分辨率的结果,分辨率由用户指定。

1
是的,这段代码实际上是进行了4.1倍的“数字缩放”,因此输出图像的分辨率应为205 x 205,或类似的值。当未指定时,resize使用双线性插值进行上采样。结果将具有更高的分辨率,但不会比原始低分辨率图像更清晰。

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