天天看點

圖像金字塔從理論到實踐專題

1、資源搜尋

​​圖像金字塔-百度百科​​

​​【OpenCV學習筆記】之圖像金字塔(Image Pyramid)​​

​​高斯金字塔與拉普拉斯金字塔​​

​​數字圖像處理(21): 圖像金字塔(高斯金字塔 與 拉普拉斯金字塔)​​

2、本人總結

        在講解圖像金字塔相關知識的時候,我還是首先考慮一個問題,為什麼會出現圖像金字塔這個概念。我們在對一張圖像進行處理的時候,計算機不像我們人眼一看,一看就知道這裡面含有什麼物體。是以這時候我們需要把圖像中一些重要的資訊提取出來,然後在讓計算機去了解。就好比我們在教小孩子知識的時候,往往就是讓複雜問題簡單化,來幫助他更快的了解。是以,要提取圖像中有用的資訊,就涉及到金字塔中一個重要的概念拉普拉斯金字塔,來得到圖像的高頻資訊。在比如我們人類在看一樣東西的時候,隻要在人眼可視的範圍内,無論這個物體放到多遠,我們都能很精确知道這個物體是什麼。但是計算機要認識這個物體,你需要把這個物體在遠處是什麼樣子、近處是什麼樣子,都要清清楚楚的告訴它一邊,而從單張圖像實作圖像的遠近,就要用到金字塔中一個重要的概念高斯金字塔。上面列舉的例子,隻是圖像金字塔中的幾個可能的應用,它還可以用到很多具體的圖像進行中,例如圖像融合、光流、SIFT等等,後面有時間的話,我會把概念一一講解。

2.1 尺度變化

       尺度變化即實作圖像分辨率大小的變化,在OpenCV中使用的函數是resize函數。其中,在對圖像縮小處理的時候,一般采用的CV_INTER_AERA(區域插值)的方法。在對圖像放大的使用一般采用的是CV_INTER_LINEAR(線性插值)。

2.2 圖像金字塔

      圖像金字塔實作了多尺度的表達,金字塔的底層為高分辨率的原始圖像,高層為了低分辨率圖像,而且層越高圖像的分辨率越小。主要使用在圖像分割、圖像壓縮、比對等方向。其中,圖像金字塔中比較常見的就是高斯金字塔和拉普拉斯金字塔。

     高斯金字塔:用來進行向上/向下采樣,是主要的圖像金字塔。

     拉普拉斯金字塔:在金字塔低層圖像重建上層未采樣圖像,在數字圖像進行中用來預測殘差,對圖像進行最大程度的還原,與高斯金字塔配合使用。

圖像金字塔從理論到實踐專題

      兩者的主要差別:高斯金字塔是在原始圖像的基礎上,對圖像進行下采樣,圖像的分辨率越來越低;拉普拉斯金字塔則是從金字塔的底層向上采樣來重建圖像。

2.3 高斯金字塔

2.3.1 圖像下采樣:縮小圖像

對圖像進行下采樣,一般由兩步實作:對圖像進行高斯卷積核處理(高斯濾波);删除所有的偶數行和列;

圖像金字塔從理論到實踐專題

根據上圖可以看到,圖像的分辨率一開始是M X N,經過一次操作後圖像的分辨率變為M/2 X N/2,後面以此類推。

圖像金字塔從理論到實踐專題

注:因為每次在進行下采樣的時候,都會減少行列,是以圖像的資訊不斷丢失。

2.3.2 圖像下采樣OpenCV實作下采樣

(1)源代碼

#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{
  Mat src, dest1, dest2, show;
  src = imread("0.jpg");
  //降采樣
  pyrDown(src, dest1, Size(src.cols / 2, src.rows / 2));
  pyrDown(dest1, dest2, Size(dest1.cols / 2, dest1.rows / 2));
  namedWindow("image", CV_WINDOW_AUTOSIZE);
  show.create(src.rows, src.cols + dest1.cols + dest2.cols, CV_8UC3);
  src.copyTo(show(Rect(0, 0, src.cols, src.rows)));
  dest1.copyTo(show(Rect(src.cols, 0, dest1.cols, dest1.rows)));
  dest2.copyTo(show(Rect(src.cols + dest1.cols, 0, dest2.cols, dest2.rows)));
  imshow("image", show);
  cvWaitKey();
}      

(2)降采樣效果圖

圖像金字塔從理論到實踐專題

2.3.3 圖像上采樣:放大圖像

        圖像進行上采樣說白了就是不斷的放大圖像,每進行一次處理,圖像的行和寬都會放大原來的一倍。那麼放大的像素怎麼來的呢,一般都是在要放大圖像中添加新增的行和列,均用0作為填充。

圖像金字塔從理論到實踐專題

關于行列中填充的實作:

圖像金字塔從理論到實踐專題

請注意:我們進行的上采樣和下采樣的過程是不可逆的,其實不說你也可以想到,每次下采樣都會丢失資料,是以即使在進行上采樣,丢失的資料也不會回來。

2.3.3 圖像上采樣:OpenCV實作

(1)源代碼

#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{
  Mat src, dest1, dest2, show;
  src = imread("1.jpg");
  //降采樣
  pyrUp(src, dest1, Size(src.cols * 2, src.rows * 2));
  pyrUp(dest1, dest2, Size(dest1.cols * 2, dest1.rows * 2));
  namedWindow("image", CV_WINDOW_AUTOSIZE);
  show.create(dest2.rows, src.cols + dest1.cols + dest2.cols, CV_8UC3);
  src.copyTo(show(Rect(0, 0, src.cols, src.rows)));
  dest1.copyTo(show(Rect(src.cols, 0, dest1.cols, dest1.rows)));
  dest2.copyTo(show(Rect(src.cols + dest1.cols, 0, dest2.cols, dest2.rows)));
  imwrite("./1.jpg", dest2);
  imshow("image", show);
  cvWaitKey();
}      

(2)效果圖

圖像金字塔從理論到實踐專題

2.4 拉普拉斯金字塔

2.4.1 基礎過程

其實拉普拉斯金字塔是在高斯金字塔的基礎上,實作的新金字塔。拉普拉斯金字塔的表達式:

圖像金字塔從理論到實踐專題

下面我們通過兩個流程圖來進行分析:

圖像金字塔從理論到實踐專題

        說明:我們可以看到首先對原始圖像進行高斯金字塔,然後在最頂層開始,對圖像進行上采樣。将上采樣後的圖像與目前層對應的高斯層圖像進行做差,來得到圖像的輪廓即高頻資訊。上面這個過程稱為“拉普拉斯金字塔”操作。

圖像金字塔從理論到實踐專題
圖像金字塔從理論到實踐專題

        上面兩幅圖像,通過将高斯金字塔和拉普拉斯金字塔整合,得到不同的圖像。首先還是先對圖像進行高斯金字塔處理,之後經過拉普拉斯金字塔得到高頻資訊,将高頻資訊與經過高斯上采樣來的同層圖像來合成一張圖像。

2.4.2 拉普拉斯金字塔OpenCV實作

(1)源代碼

#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{
  Mat src, dest1, dest2, show;
  Mat dest1Up, dest2Up;
  Mat laplaceSrc, laplaceDest;

  src = imread("0.jpg");
  //降采樣
  pyrDown(src, dest1, Size(src.cols / 2, src.rows / 2));
  pyrDown(dest1, dest2, Size(dest1.cols / 2, dest1.rows / 2));
  namedWindow("image", CV_WINDOW_AUTOSIZE);
  
  pyrUp(dest2, dest2Up, Size(dest2.cols * 2, dest2.rows * 2));
  pyrUp(dest1, dest1Up, Size(dest1.cols * 2, dest1.rows * 2));


  show.create(src.rows * 3, src.cols + dest1.cols, CV_8UC3);
  laplaceSrc = src - dest1Up;
  laplaceDest = dest1 - dest2Up;

  src.copyTo(show(Rect(0, 0, src.cols, src.rows)));
  dest1Up.copyTo(show(Rect(0, src.rows, dest1Up.cols, dest1Up.rows)));
  laplaceSrc.copyTo(show(Rect(0, src.rows + dest1Up.rows, laplaceSrc.cols, laplaceSrc.rows)));

  dest1.copyTo(show(Rect(src.cols, 0, dest1.cols, dest1.rows)));
  dest2Up.copyTo(show(Rect(src.cols, dest1.rows, dest2Up.cols, dest2Up.rows)));
  laplaceDest.copyTo(show(Rect(src.cols, dest1.rows + dest2Up.rows, laplaceDest.cols, laplaceDest.rows)));

  imshow("image", show);
  cvWaitKey();
}      

(2)效果圖

圖像金字塔從理論到實踐專題