日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

OpenCV实现图像金字塔

發布時間:2025/7/25 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV实现图像金字塔 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目的:

使用OpenCV中的函數 cv::pyrUp 和 cv::pyrDown 對給定的圖像下采樣和上采樣(downsample 和 upsample).


理論

  • 一般需要把圖像的尺寸調整為和原圖不一樣的大小。有兩種方法:
  • Upsize(擴大) the image (zoom in) or
  • Downsize(縮小) it (zoom out).
  • OpenCV 中存也有一個幾何變換函數 cv::resize 。本節將分析在圖像視覺中廣泛使用的圖像金字塔中的使用。

圖像金字塔

  • 圖像金字塔是一組圖像的集合--從一個單一的原始圖像開始,依次下采樣直到達到預期的條件為止
  • 有兩種常見的圖像金字塔類型:
Gaussian pyramid: 用于降采樣圖像
Laplacian pyramid:
 用于從圖像金字塔較低層(分辨率較低)重建上采樣圖像
  • 在本教程中,我們將使用高斯金字塔。

高斯金字塔(Gaussian Pyramid)

圖像金字塔有一系列的層構成,層越高尺寸越小。



  • 每一層從低到頂編號,所以層 (i+1) (denoted as Gi+1比層i ( Gi)小.
  • 在高斯金字塔中生成層(i+1) ,需要按照如下步驟:

    • Gi 用高斯核卷積:
    116???????1464141624164624362464162416414641???????
    • 刪除每一個偶數行和列.
  • 可以注意到結果圖像的面積是上一層面積的四分之一.對輸入圖像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函數實現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;}


結果


  • 圖像 chicky_512.jpg 大小為512×512, 下采樣不會產生任何錯誤( 512=29). 原圖如下


  • 首先,連續兩次使用 cv::pyrDown ,通過按鍵'd'實現.輸出如下:


  • 注意到由于降采樣已經丟失了一些信息. 這個在使用兩次 cv::pyrUp 后可以看到 (按鍵 'u'). 結果如下:




總結

以上是生活随笔為你收集整理的OpenCV实现图像金字塔的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。