使用 opencv 增加图像比例并最大化分辨率?
Increasing image scale and maximizing resolution using opencv?
我刚刚开始研究 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;
}
是的,此代码实际上是在执行 4.1x "digital zoom",因此输出图像的分辨率应为 205 x 205,或类似的分辨率。如果未指定,resize 使用 bilinear interpolation 进行上采样。结果将具有更高的分辨率,但不会比原始低分辨率图像更清晰。
正如这里的人先前所说,在增加图像大小时使用插值非常有限。当您增加图像的分辨率时,您正在使用先前分辨率的像素来猜测它们的值。虽然图像会更高分辨率,但质量不会更好。
已提出的一种克服此问题的技术是 super resolution 的想法。这个想法是,当你看一个场景时,你会从不同的角度拍摄几张不同的图像。每个图像都提供了一些其他图像以前没有看到的信息的细微差别。您确定每个视点的独特之处,然后将这些信息组合在一起以制作质量更好的增强图像流。不幸的是,这不适用于单个图像,因为没有额外的信息可以从图像流中提取。但是,您可以 使用同一视点的多个图像。在相机传感器处引入的噪声曲线应该足以为超分辨率算法提供不同的信息,以便生成更高质量的放大图像。事实上,超分辨率的想法是拍摄几张 "low quality" 的图像,并通过将它们的信息组合在一起成为最终图像来创建高质量的结果。这个想法已经存在了一段时间,不仅与图像处理有关,而且还涉及科学显微镜和成像的各个领域。
仅使用单个图像进入人工创建超分辨率图像的领域,这可能会或可能不会工作,具体取决于图像。拥有图像流将有更高的成功概率。您可以在此处阅读有关超级分辨率的更多详细信息: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
语句中所见。该代码仅接收视频源并以所需的分辨率输出基于超分辨率的结果。
我刚刚开始研究 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;
}
是的,此代码实际上是在执行 4.1x "digital zoom",因此输出图像的分辨率应为 205 x 205,或类似的分辨率。如果未指定,resize 使用 bilinear interpolation 进行上采样。结果将具有更高的分辨率,但不会比原始低分辨率图像更清晰。
正如这里的人先前所说,在增加图像大小时使用插值非常有限。当您增加图像的分辨率时,您正在使用先前分辨率的像素来猜测它们的值。虽然图像会更高分辨率,但质量不会更好。
已提出的一种克服此问题的技术是 super resolution 的想法。这个想法是,当你看一个场景时,你会从不同的角度拍摄几张不同的图像。每个图像都提供了一些其他图像以前没有看到的信息的细微差别。您确定每个视点的独特之处,然后将这些信息组合在一起以制作质量更好的增强图像流。不幸的是,这不适用于单个图像,因为没有额外的信息可以从图像流中提取。但是,您可以 使用同一视点的多个图像。在相机传感器处引入的噪声曲线应该足以为超分辨率算法提供不同的信息,以便生成更高质量的放大图像。事实上,超分辨率的想法是拍摄几张 "low quality" 的图像,并通过将它们的信息组合在一起成为最终图像来创建高质量的结果。这个想法已经存在了一段时间,不仅与图像处理有关,而且还涉及科学显微镜和成像的各个领域。
仅使用单个图像进入人工创建超分辨率图像的领域,这可能会或可能不会工作,具体取决于图像。拥有图像流将有更高的成功概率。您可以在此处阅读有关超级分辨率的更多详细信息: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
语句中所见。该代码仅接收视频源并以所需的分辨率输出基于超分辨率的结果。