OpenCV圖像金字塔

2018-09-05 10:38 更新

目標(biāo)

在本教程中,您將學(xué)習(xí)如何:

理論

注意
下面的解釋屬于Bradski和Kaehler 的“ 學(xué)習(xí)OpenCV ”一書。
  • 通常我們需要將圖像轉(zhuǎn)換成與原始圖像不同的大小。為此,有兩個(gè)可能的選擇:升高圖像(放大)或縮?。s?。?。
  • 雖然有一個(gè)幾何變換中的OpenCV函數(shù)-literally-調(diào)整圖像大?。?a rel="external nofollow" target="_blank" target="_blank">CV ::調(diào)整大小,我們將在以后的教程顯示),在該部分中,我們分析第一使用圖像金字塔,這是在廣泛應(yīng)用的視覺范圍廣泛的應(yīng)用。

圖像金字塔

  • 圖像金字塔是由單個(gè)原始圖像產(chǎn)生的圖像的集合,它們被連續(xù)下采樣,直到達(dá)到一些所需的停止點(diǎn)。
  • 有兩種常見的圖像金字塔:高斯金字塔:用于縮減圖像拉普拉斯金字塔:用于從金字塔中較低的圖像重建上采樣圖像(分辨率較低)
  • 在本教程中,我們將使用高斯金字塔。

高斯金字塔

  • 想象一下金字塔是一組層,層數(shù)越高,尺寸越小。

OpenCV圖像金字塔

  • 每個(gè)層從底部到頂部編號(hào),因此層(i+1)(表示為Gi+1)小于層i(Gi)。
  • 為了在高斯金字塔中產(chǎn)生層(i+1),我們做如下:

將Gi與高斯內(nèi)核進(jìn)行卷積:

OpenCV圖像金字塔

刪除每個(gè)偶數(shù)行和列。

  • 您可以輕松注意到,所得到的圖像將是其前身的四分之一。在輸入圖像(原始圖像)上迭代該過程產(chǎn)生整個(gè)金字塔。G0
  • 上面的過程對(duì)于縮小圖像是有用的。如果我們想使它更大,怎么辦?:填充零的列()0
  1. 首先,將圖像大小增加到每個(gè)維度的兩倍,即新的偶數(shù)行和
  2. 用與上述相同的內(nèi)核(乘以4)執(zhí)行卷積近似“丟失像素”的值
注意
當(dāng)我們減小圖像的大小時(shí),我們實(shí)際上丟失了圖像的信息。

Code

本教程代碼如下所示。您也可以從這里下載


#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
using namespace cv;
Mat src, dst, tmp;
const char* window_name = "Pyramids Demo";
int main( void )
{
  printf( "\n Zoom In-Out demo  \n " );
  printf( "------------------ \n" );
  printf( " * [u] -> Zoom in  \n" );
  printf( " * [d] -> Zoom out \n" );
  printf( " * [ESC] -> Close program \n \n" );
  src = imread( "../data/chicky_512.png" ); // Loads the test image
  if( src.empty() )
    { printf(" No data! -- Exiting the program \n");
      return -1; }
  tmp = src;
  dst = tmp;
  imshow( window_name, dst );
  for(;;)
  {
    char c = (char)waitKey(0);
    if( c == 27 )
      { break; }
    if( c == 'u' )
      { pyrUp( tmp, dst, Size( tmp.cols*2, tmp.rows*2 ) );
        printf( "** Zoom In: Image x 2 \n" );
      }
    else if( c == 'd' )
      { pyrDown( tmp, dst, Size( tmp.cols/2, tmp.rows/2 ) );
        printf( "** Zoom Out: Image / 2 \n" );
      }
    imshow( window_name, dst );
    tmp = dst;
   }
   return 0;
}

說明

我們來看一下程序的一般結(jié)構(gòu):

  • 加載圖像(在這種情況下,它在程序中定義,用戶不必將其作為參數(shù)輸入)
  src = imread( "../data/chicky_512.png" ); // Loads the test image
  if( src.empty() )
    { printf(" No data! -- Exiting the program \n");
      return -1; }
  • 創(chuàng)建一個(gè)Mat對(duì)象以存儲(chǔ)操作的結(jié)果(dst),另一個(gè)用于保存時(shí)間結(jié)果(tmp)。
Mat src,dst,tmp;
/ * ... * /
tmp = src;
dst = tmp;
  • 創(chuàng)建一個(gè)窗口來顯示結(jié)果
  imshow(window_name,dst);

執(zhí)行無限循環(huán)等待用戶輸入。

  for(;;)
  {
    char c = (char)waitKey(0);
    if( c == 27 )
      { break; }
    if( c == 'u' )
      { pyrUp( tmp, dst, Size( tmp.cols*2, tmp.rows*2 ) );
        printf( "** Zoom In: Image x 2 \n" );
      }
    else if( c == 'd' )
      { pyrDown( tmp, dst, Size( tmp.cols/2, tmp.rows/2 ) );
        printf( "** Zoom Out: Image / 2 \n" );
      }
    imshow( window_name, dst );
    tmp = dst;
   }

如果用戶按ESC鍵退出我們的程序。此外,它有兩個(gè)選擇:

  • 執(zhí)行上采樣(按'u')
        if( c == 'u' )
          { pyrUp( tmp, dst, Size( tmp.cols*2, tmp.rows*2 ) );
            printf( "** Zoom In: Image x 2 \n" );
          }
  • 我們使用函數(shù)cv :: pyrUp與三個(gè)參數(shù):
    • tmp:當(dāng)前圖像,它是用src原始圖像初始化的。
    • dst:目標(biāo)圖像(要顯示在屏幕上,據(jù)說是輸入圖像的兩倍)
    • *大小(tmp.cols * 2,tmp.rows * 2)*:目的地大小。由于我們是上采樣,cv :: pyrUp的大小要比輸入圖像大一倍(在這種情況下是tmp)。
  • 執(zhí)行下采樣(按'd'后)
        else if( c == 'd' )
          { pyrDown( tmp, dst, Size( tmp.cols/2, tmp.rows/2 ) );
            printf( "** Zoom Out: Image / 2 \n" );
          }
  • 類似于cv :: pyrUp,我們使用三個(gè)參數(shù)的函數(shù)cv :: pyrDown
    • tmp:當(dāng)前圖像,它是用src原始圖像初始化的。
    • dst:目標(biāo)圖像(要顯示在屏幕上,據(jù)說是輸入圖像的一半)
    • 大?。╰mp.cols / 2,tmp.rows / 2):目的地大小。由于我們是上采樣,cv :: pyrDown預(yù)期輸入圖像的大?。ㄔ谶@種情況下為tmp)的一半。
  • 請(qǐng)注意,輸入圖像的重要性可以除以二分之一(兩個(gè)維度)。否則,將顯示錯(cuò)誤。
  • 最后,我們使用顯示的當(dāng)前圖像更新輸入圖像tmp,因此執(zhí)行后續(xù)操作。
    tmp = dst;

結(jié)果

  • 在編譯上面的代碼之后,我們可以測試一下。該程序調(diào)用圖像chicky_512.jpg自帶的樣品/數(shù)據(jù)文件夾中。請(qǐng)注意,此圖像為512 × 512,因此下采樣不會(huì)產(chǎn)生任何錯(cuò)誤(512 = 29)。原始圖像如下所示:

OpenCV圖像金字塔

  • 首先我們通過按“d” 應(yīng)用兩個(gè)連續(xù)的cv :: pyrDown操作。我們的產(chǎn)出是:

OpenCV圖像金字塔

  • 請(qǐng)注意,由于我們正在減少圖像的大小,我們應(yīng)該已經(jīng)失去了一些解決方案。這是很明顯的,我們應(yīng)用cv :: pyrUp兩次(通過按'u')。我們的產(chǎn)品現(xiàn)在是:

OpenCV圖像金字塔

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)