我刚开始研究OpenCV,我看过一些类似的问题,但我没有找到有用的答案。我有许多像素尺寸为50宽和50高(拇指指甲大小)的图像。
我对以下内容感到有些困惑:
Q值。通过增加这些图像的比例,我会自动提高分辨率吗?或者我是否需要执行其他功能?
我必须在增加图像比例的同时获得最大分辨率。
我正在使用以下功能:
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;
}
答案 0 :(得分:4)
如前所述,在增加图像尺寸时,使用插值非常有限。您使用上一分辨率的像素来猜测在增加图像分辨率时它们的值是什么。虽然图像的分辨率会更高,但质量却不会提高。
为解决这个问题而提出的一种技术是super resolution的想法。这样做的想法是,当你观察一个场景时,你会看到不同视角的几个不同的图像。每张图片都提供了其他图片之前没有见过的信息略有差异。您可以确定每个视点的独特之处,然后将这些信息组合在一起,以生成质量更好的增强图像流。遗憾的是,这不适用于单个图像,因为没有从图像流中提取的附加信息。您可以然而使用相同视点的多个图像。在相机传感器处引入的噪声分布应该足以向超分辨率算法提供不同的信息,以便产生更高质量的放大图像。实际上,超分辨率的想法是拍摄几张低质量的图像。并通过将他们的信息组合成最终图像来创建高质量的结果。这个想法已经存在了一段时间,不仅与图像处理有关,而且与显微镜和科学成像的各个领域有关。
仅使用单个图像进入人工创建超分辨率图像的区域,根据图像,这些图像可能会也可能不会起作用。拥有一组图像将有更高的成功概率。您可以在此处阅读有关超级分辨率的更多详细信息:http://www.infognition.com/articles/what_is_super_resolution.html
幸运的是,OpenCV确实有一个实现超分辨率的模块,它可以在Super Resolution module中找到。你做需要输入一系列图像,输出将是一系列图像质量更高,达到你想要的更高分辨率。
有关如何使用超级分辨率模块的代码示例,请参见OpenCV的Github repo:https://github.com/opencv/opencv/blob/master/samples/gpu/super_resolution.cpp。不要愚弄源所在的位置。即使它被置于GPU示例之下,代码也可以处理CPU和GPU案例,如if
语句中所示。代码只是采用视频输入并具有所需的分辨率,它会输出基于超分辨率的结果。
答案 1 :(得分:1)
是的,此代码实际上是在进行4.1x"数字缩放",因此输出图像应具有205 x 205的分辨率,或类似的东西。如果未指定,则调整大小时会使用bilinear interpolation进行上采样。结果将具有更高的分辨率,但不会比原始的低分辨率图像更清晰。