html5大气网站,小程序怎么上架,网络营销的常用策略,门户网站怎么开发目标
在本教程中#xff0c;您将学习如何#xff1a;
使用 OpenCV 函数 pyrUp()和 pyrDown()对给定图像进行下采样或上采样。
理论
注意
下面的解释属于 Bradski 和 Kaehler 的 Learning OpenCV 一书。
通常#xff0c;我们需要将图像转换为与原始图像不同的大小。为此…
目标
在本教程中您将学习如何
使用 OpenCV 函数 pyrUp()和 pyrDown()对给定图像进行下采样或上采样。
理论
注意
下面的解释属于 Bradski 和 Kaehler 的 Learning OpenCV 一书。
通常我们需要将图像转换为与原始图像不同的大小。为此有两种可能的选择 放大图像放大或缩小它缩小。尽管 OpenCV 中有一个几何变换函数可以从字面上调整图像大小调整大小我们将在以后的教程中展示但在本节中我们首先分析了图像金字塔的使用它广泛应用于广泛的视觉应用。 图像金字塔
图像金字塔是图像的集合 - 所有图像都来自单个原始图像 - 这些图像被连续下采样直到达到某个所需的停止点。图像金字塔有两种常见的类型 高斯金字塔用于对图像进行缩减采样拉普拉斯金字塔用于从金字塔下部的图像分辨率较低重建上采样图像在本教程中我们将使用高斯金字塔。
高斯金字塔
将金字塔想象成一组层其中层越高尺寸越小。 每一层都从下到上编号因此层(i1)(表示为 G_(i1)小于层I(Gi)。 为了在高斯金字塔中生成层(I1)我们执行以下操作 用高斯核卷积Gi 删除每个偶数行和列。您可以很容易地注意到生成的图像将恰好是其前身的四分之一。在输入图像 \G_{0}\原始图像上迭代此过程将生成整个金字塔。上述过程对于图像的缩减采样非常有用。如果我们想让它变大怎么办用零填充的列 \0 \ 首先将图像在每个维度上放大到原始图像的两倍使用新的偶数行和使用上面显示的相同内核乘以 4执行卷积以近似“缺失像素”的值这两个过程如上所述的下采样和上采样由 OpenCV 函数 pyrUp 和 pyrDown 实现我们将在下面代码的示例中看到
注意
当我们减小图像的大小时我们实际上丢失了图像的信息。
演示代码 C
本教程代码如下所示。
您也可以从这里下载
#include iostream
#include opencv2/imgproc.hpp
#include opencv2/imgcodecs.hpp
#include opencv2/highgui.hppusing namespace std;
using namespace cv;const char* window_name Pyramids Demo;int main( int argc, char** argv )
{cout \n Zoom In-Out demo \n ------------------ \n * [i] - Zoom in \n * [o] - Zoom out \n * [ESC] - Close program \n endl;const char* filename argc 2 ? argv[1] : chicky_512.png;// Loads an imageMat src imread( samples::findFile( filename ) );// Check if image is loaded fineif(src.empty()){printf( Error opening image\n);printf( Program Arguments: [image_name -- default chicky_512.png] \n);return EXIT_FAILURE;}for(;;){imshow( window_name, src );char c (char)waitKey(0);if( c 27 ){ break; }else if( c i ){ pyrUp( src, src, Size( src.cols*2, src.rows*2 ) );printf( ** Zoom In: Image x 2 \n );}else if( c o ){ pyrDown( src, src, Size( src.cols/2, src.rows/2 ) );printf( ** Zoom Out: Image / 2 \n );}}return EXIT_SUCCESS;
}
解释 C
让我们检查一下程序的一般结构
加载图像 const char* filename argc 2 ? argv[1] : chicky_512.png;// Loads an imageMat src imread( samples::findFile( filename ) );// Check if image is loaded fineif(src.empty()){printf( Error opening image\n);printf( Program Arguments: [image_name -- default chicky_512.png] \n);return EXIT_FAILURE;}
创建窗口 imshow( window_name, src );
消息循环 for(;;){imshow( window_name, src );char c (char)waitKey(0);if( c 27 ){ break; }else if( c i ){ pyrUp( src, src, Size( src.cols*2, src.rows*2 ) );printf( ** Zoom In: Image x 2 \n );}else if( c o ){ pyrDown( src, src, Size( src.cols/2, src.rows/2 ) );printf( ** Zoom Out: Image / 2 \n );}}
执行无限循环等待用户输入。如果用户按 ESC我们的程序将退出。此外它有两个选项 执行上采样 - 缩放 in按下“i”后 我们使用带有三个参数的函数 pyrUp src当前和目标图像显示在屏幕上应该是输入图像的双倍Size tmp.cols*2 tmp.rows*2 目标大小。由于我们是上采样pyrUp 的大小是输入图像的两倍在本例中为 src。 else if( c i ){ pyrUp( src, src, Size( src.cols*2, src.rows*2 ) );printf( ** Zoom In: Image x 2 \n );} 执行缩减采样 - 缩放 out按下 o 后 我们使用带有三个参数的函数 pyrDown 类似于 pyrUp src当前和目标图像显示在屏幕上应该是输入图像的一半Size(tmp.cols/2 tmp.rows/2 ) 目标大小。由于我们正在缩减采样pyrDown() 需要输入图像的一半大小在本例中为 src。 else if( c o ){ pyrDown( src, src, Size( src.cols/2, src.rows/2 ) );printf( ** Zoom Out: Image / 2 \n );}
请注意输入图像可以除以 2 倍在两个维度上非常重要。否则将显示错误。 结果
默认情况下samples/data程序调用文件夹中的图像chicky_512.png。请注意此图像是 \512 \times 512\因此下采样不会生成任何错误 \512 2^{9}\。原图如下图所示 首先我们通过按“d”来应用两个连续的 pyrDown()操作。我们的输出是 注意由于我们正在减小图像的大小我们应该会失去一些分辨率。在我们应用 pyrUp() 两次按“u”后这一点很明显。我们现在的输出是 参考文献
1、《Image Pyramids》-----Ana Huamán