2016-12-15 1054 views
1

我刚开始关注OpenCV,我看过一些类似的问题,但是我没有找到有用的答案。我有许多像素尺寸为50宽和50高(缩略图尺寸)的图像。使用opencv增加图像比例和最大化分辨率?

我轻度的意识模糊有关以下内容:

问:通过增加这些图像的规模,我会自动提高分辨率?或者我需要执行另一个功能?

它的基本要素是我可以获得最大分辨率,同时增加图像的比例。

我使用下面的功能:

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像素的真实值。你需要讨论剩下的价值。这称为_interpolation_。您可以使用不同类型的插值,您可以选择其作为调整大小函数中的最后一个参数。所以不行。你不是在提高分辨率......只是最好的填充洞 – Miki

+0

谢谢@Miki - 是否有任何技术可以用来提高分辨率? –

回答

2

正如此前人们所述,在增加图像大小时,使用插值法非常有限。当您增加图像的分辨率时,您正在使用先前分辨率的像素来猜测它们的值。虽然图像的分辨率会更高,但质量并不会更好。

已经提出来克服这个问题的一种技术是super resolution的想法。这个想法是,当你看一个场景时,你会看到几个不同的图像,看着不同的视角。每幅图像都提供了其他图像以前未见过的信息中的细微差异。您可以确定每个视点的独特之处,然后将这些信息结合在一起,形成更高质量的增强图像流。这不幸的是不能用于单个图像,因为没有附加信息从图像流中提取。您可以使用可以使用同一视点的多个图像。在相机传感器中引入的噪声轮廓应该足以向超分辨率算法提供不同的信息,以产生更高质量的放大图像。事实上,超分辨率的想法是拍摄几张“低质量”的图像,并通过将其信息组合成最终图像来创造高质量的结果。这个想法已经存在了一段时间,不仅与图像处理有关,而且还涉及显微镜和科学成像的各个领域。

仅使用单个图像进入人工创建超分辨率图像的区域,这可能会影响也可能不会影响取决于图像。拥有一串图像将有更高的成功可能性。你可以在这里阅读关于超分辨率的更多细节: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分辨率,或什么的。当未指定时,调整大小使用bilinear interpolation进行上采样。结果将有更高的分辨率,但不会比原始的低分辨率图像更清晰。