Opencv2.4學習::特徵分析(一)尺度空間
阿新 • • 發佈:2018-12-24
尺度空間
尺度空間就是試圖在影象領域中模擬人眼觀察物體的概念與方法。
這是由於通過計算機視覺系統,我們無法直接獲取所關注物體、物件的大小,這時候就需要一個尺度空間來描述
一、區域性不變性
對於目標物體,我們希望通過一些特徵來描述它。比如車,可以選取車牌、輪廓等特徵,對於人臉,則有五官、面型等特徵。
分析影象物體時,我們關注的是目標與背景的差異性,區域性不變性就是特徵分析的重要性質。其包括:
- 尺度不變性
- 旋轉不變性
(1)尺度不變性:攝像頭相對於物體遠近呈現出來的物體尺寸不受其大小影響。 貌似說:就是不管你的物體大小如何,攝像頭都可以改變目標物體的影象大小,只不過是攝像頭放的遠近問題。比如說:兩個除了尺寸之外都一樣的球,攝像頭離大的球遠一些,離小的球近一些,在某個點上,就會出現影象上兩個球一樣大小的情況。
(2)旋轉不變性:描述物體發生旋轉操作與目標認知分析無關。
即若影象按下式進行變換(相當於所有座標在極座標下旋轉θ角度):
影象的某些特徵值不變,(某些函式值不變,如hu矩)
另外一個熟悉的具有旋轉不變形的是拉普拉斯運算元,具體證明參見:為什麼拉普拉斯運算元具有旋轉不變性
二、二維影象的尺度空間定義:
三、特徵點尺度變換
這裡給出一個利用影象金字塔和高斯卷積操作產生多尺度空間的例子。
參見《Opencv影象處理程式設計例項》
#include<iostream> #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> using namespace std; using namespace cv; //尺度變換的一種實現 void CreateScaleSpace(Mat srcImage, vector<vector<Mat>>&ScaleSpace, vector<vector<Mat>>&DoG) { Size ksize(5, 5); double sigma; Mat srcBlurMat, up, down; //高斯濾波 GaussianBlur(srcImage, srcBlurMat, ksize, 0.5); //金字塔 pyrUp(srcBlurMat, up); ScaleSpace[0].push_back(up); //GaussianBlur GaussianBlur(ScaleSpace[0][0], ScaleSpace[0][0], ksize, 1.0); //影象遍歷 int i; for (i = 0; i < 4; i++){ //平滑因子 double sigma = 1.4142135; for (int j = 0; j < 5 + 2; j++){ sigma = sigma*pow(2.0, j / 2.0); //對下一尺度進行高斯操作 Mat tmp1,tmp2; GaussianBlur(ScaleSpace[i][j],tmp1, ksize, sigma); ScaleSpace[i].push_back(tmp1); imshow("tmp", tmp1); waitKey(0); //生成多尺度空間 tmp2 = ScaleSpace[i][j] - ScaleSpace[i][j + 1]; DoG[i].push_back(tmp2); //輸出對應特徵空間尺度 //imshow("tmp", tmp); } //如果不能完成,繼續進行金字塔操作 if (i < 3){ //金字塔下采樣 pyrDown(ScaleSpace[i][0], down); ScaleSpace[i + 1].push_back(down); } } } int main() { Mat srcImg = imread("F:\\opencv_re_learn\\flash.jpg"); if (!srcImg.data){ cout << "failed to read" << endl; system("pause"); return -1; } vector<vector<Mat>>ScaleSpace(100); vector<vector<Mat>>DoG(100); CreateScaleSpace(srcImg, ScaleSpace, DoG); imshow("src", srcImg); imshow("scale", ScaleSpace[2][1]); waitKey(0); return 0; }