OpenCV实现图像金字塔
生活随笔
收集整理的這篇文章主要介紹了
OpenCV实现图像金字塔
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目的:
使用OpenCV中的函數(shù) cv::pyrUp 和 cv::pyrDown 對給定的圖像下采樣和上采樣(downsample 和 upsample).
理論
- 一般需要把圖像的尺寸調(diào)整為和原圖不一樣的大小。有兩種方法:
- Upsize(擴大) the image (zoom in) or
- Downsize(縮小) it (zoom out).
- OpenCV 中存也有一個幾何變換函數(shù) cv::resize 。本節(jié)將分析在圖像視覺中廣泛使用的圖像金字塔中的使用。
圖像金字塔
- 圖像金字塔是一組圖像的集合--從一個單一的原始圖像開始,依次下采樣直到達到預(yù)期的條件為止
- 有兩種常見的圖像金字塔類型:
Laplacian pyramid: 用于從圖像金字塔較低層(分辨率較低)重建上采樣圖像
- 在本教程中,我們將使用高斯金字塔。
高斯金字塔(Gaussian Pyramid)
圖像金字塔有一系列的層構(gòu)成,層越高尺寸越小。
- 每一層從低到頂編號,所以層 (i+1) (denoted as Gi+1 )比層i ( Gi)小.
-
在高斯金字塔中生成層(i+1) ,需要按照如下步驟:
- 對 Gi 用高斯核卷積:
- 刪除每一個偶數(shù)行和列.
- 可以注意到結(jié)果圖像的面積是上一層面積的四分之一.對輸入圖像G0 (原始圖像)迭代這個過程得到整個金字塔。
- 以上處理過程為對一個圖像下采樣. 如果想讓它變大?: 用0來填充列
- First, upsize the image to twice the original in each dimension, wit the new even rows and
- Perform a convolution with the same kernel shown above (multiplied by 4) to approximate the values of the "missing pixels"
- 這兩個程序(下采樣和上采樣)由OpenCV函數(shù)實現(xiàn)cv::pyrup和cv::pyrdown, 例子見下面代碼
代碼
/*** @file Pyramids.cpp* @brief Sample code of image pyramids (pyrDown and pyrUp)* @author OpenCV team*/#include "opencv2/imgproc.hpp"#include "opencv2/imgcodecs.hpp"#include "opencv2/highgui.hpp"using namespace cv;/// Global variablesMat src, dst, tmp;const char* window_name = "Pyramids Demo";/*** @function main*/int main( void ){/// General instructionsprintf( "\n Zoom In-Out demo \n " );printf( "------------------ \n" );printf( " * [u] -> Zoom in \n" );printf( " * [d] -> Zoom out \n" );printf( " * [ESC] -> Close program \n \n" );//![load]src = imread( "../data/chicky_512.png" ); // Loads the test imageif( src.empty() ){ printf(" No data! -- Exiting the program \n");return -1; }//![load]tmp = src;dst = tmp;//![create_window]imshow( window_name, dst );//![create_window]//![infinite_loop]for(;;){int c;c = waitKey(0);if( (char)c == 27 ){ break; }if( (char)c == 'u' ){//![pyrup]pyrUp( tmp, dst, Size( tmp.cols*2, tmp.rows*2 ) );//![pyrup]printf( "** Zoom In: Image x 2 \n" );}else if( (char)c == 'd' ){//![pyrdown]pyrDown( tmp, dst, Size( tmp.cols/2, tmp.rows/2 ) );//![pyrdown]printf( "** Zoom Out: Image / 2 \n" );}imshow( window_name, dst );//![update_tmp]tmp = dst;//![update_tmp]}//![infinite_loop]return 0;}
結(jié)果
-
圖像 chicky_512.jpg 大小為512×512, 下采樣不會產(chǎn)生任何錯誤( 512=29). 原圖如下
-
首先,連續(xù)兩次使用 cv::pyrDown ,通過按鍵'd'實現(xiàn).輸出如下:
-
注意到由于降采樣已經(jīng)丟失了一些信息. 這個在使用兩次 cv::pyrUp 后可以看到 (按鍵 'u'). 結(jié)果如下:
-
總結(jié)
以上是生活随笔為你收集整理的OpenCV实现图像金字塔的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于形态学操作提取水平和垂直线条(五线谱
- 下一篇: 从Image Caption Gener