導航:首頁 > 源碼編譯 > 圖像金字塔演算法

圖像金字塔演算法

發布時間:2023-02-14 02:28:59

1. 如何使用opencv實現金字塔光流lk跟蹤演算法

#include <stdio.h>
#include <windows.h>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <opencv2\opencv.hpp>
using namespace cv;

static const double pi = 3.14159265358979323846;
inline static double square(int a)
{
return a * a;
}
/*該函數目的:給img分配內存空間,並設定format,如位深以及channel數*/
inline static void allocateOnDemand(IplImage **img, CvSize size, int depth, int channels)
{
if (*img != NULL) return;
*img = cvCreateImage(size, depth, channels);
if (*img == NULL)
{
fprintf(stderr, "Error: Couldn't allocate image. Out of memory?\n");
exit(-1);
}
}
/*主函數,原程序是讀取avi視頻文件,然後處理,我簡單改成從攝像頭直接讀取數據*/
int main(int argc, char *argv[])
{

//讀取攝像頭
VideoCapture cap(0);
//讀取視頻文件

//VideoCapture cap; cap.open("optical_flow_input.avi");
if (!cap.isOpened())
{
return -1;
}
Mat frame;

/*
bool stop = false;
while (!stop)
{
cap >> frame;
// cvtColor(frame, edges, CV_RGB2GRAY);
// GaussianBlur(edges, edges, Size(7, 7), 1.5, 1.5);
// Canny(edges, edges, 0, 30, 3);
// imshow("當前視頻", edges);
imshow("當前視頻", frame);
if (waitKey(30) >= 0)
stop = true;
}
*/

//CvCapture *input_video = cvCaptureFromFile( "optical_flow_input.avi" );
//cv::VideoCapture cap = *(cv::VideoCapture *) userdata;

//if (input_video == NULL)
// {
// fprintf(stderr, "Error: Can't open video device.\n");
// return -1;
// }

/*先讀取一幀,以便得到幀的屬性,如長、寬等*/
//cvQueryFrame(input_video);

/*讀取幀的屬性*/
CvSize frame_size;
frame_size.height = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
frame_size.width = cap.get(CV_CAP_PROP_FRAME_WIDTH);

/*********************************************************/

/*用於把結果寫到文件中去,非必要
int frameW = frame_size.height; // 744 for firewire cameras
int frameH = frame_size.width; // 480 for firewire cameras
VideoWriter writer("VideoTest.avi", -1, 25.0, cvSize(frameW, frameH), true);

/*開始光流法*/
//VideoWriter writer("VideoTest.avi", CV_FOURCC('D', 'I', 'V', 'X'), 25.0, Size(640, 480), true);

while (true)
{
static IplImage *frame = NULL, *frame1 = NULL, *frame1_1C = NULL,
*frame2_1C = NULL, *eig_image = NULL, *temp_image = NULL,
*pyramid1 = NULL, *pyramid2 = NULL;

Mat framet;
/*獲取第一幀*/
// cap >> framet;
cap.read(framet);
Mat edges;
//黑白抽象濾鏡模式
// cvtColor(framet, edges, CV_RGB2GRAY);
// GaussianBlur(edges, edges, Size(7, 7), 1.5, 1.5);
// Canny(edges, edges, 0, 30, 3);

//轉換mat格式到lpiimage格式
frame = &IplImage(framet);
if (frame == NULL)
{
fprintf(stderr, "Error: Hmm. The end came sooner than we thought.\n");
return -1;
}

/*由於opencv的光流函數處理的是8位的灰度圖,所以需要創建一個同樣格式的
IplImage的對象*/
allocateOnDemand(&frame1_1C, frame_size, IPL_DEPTH_8U, 1);

/* 把攝像頭圖像格式轉換成OpenCV慣常處理的圖像格式*/
cvConvertImage(frame, frame1_1C, 0);

/* 我們需要把具有全部顏色信息的原幀保存,以備最後在屏幕上顯示用*/
allocateOnDemand(&frame1, frame_size, IPL_DEPTH_8U, 3);
cvConvertImage(frame, frame1, 0);

/* 獲取第二幀 */
//cap >> framet;
cap.read(framet);
// cvtColor(framet, edges, CV_RGB2GRAY);
// GaussianBlur(edges, edges, Size(7, 7), 1.5, 1.5);
// Canny(edges, edges, 0, 30, 3);
frame = &IplImage(framet);
if (frame == NULL)
{
fprintf(stderr, "Error: Hmm. The end came sooner than we thought.\n");
return -1;
}

/*原理同上*/
allocateOnDemand(&frame2_1C, frame_size, IPL_DEPTH_8U, 1);
cvConvertImage(frame, frame2_1C, 0);

/*********************************************************
開始shi-Tomasi演算法,該演算法主要用於feature selection,即一張圖中哪些是我
們感興趣需要跟蹤的點(interest point)
input:
* "frame1_1C" 輸入圖像.
* "eig_image" and "temp_image" 只是給該演算法提供可操作的內存區域.
* 第一個".01" 規定了特徵值的最小質量,因為該演算法要得到好的特徵點,哪就
需要一個選擇的閾值
* 第二個".01" 規定了像素之間最小的距離,用於減少運算復雜度,當然也一定
程度降低了跟蹤精度
* "NULL" 意味著處理整張圖片,當然你也可以指定一塊區域
output:
* "frame1_features" 將會包含fram1的特徵值
* "number_of_features" 將在該函數中自動填充上所找到特徵值的真實數目,
該值<= 400
**********************************************************/

/*開始准備該演算法需要的輸入*/

/* 給eig_image,temp_image分配空間*/
allocateOnDemand(&eig_image, frame_size, IPL_DEPTH_32F, 1);
allocateOnDemand(&temp_image, frame_size, IPL_DEPTH_32F, 1);

/* 定義存放frame1特徵值的數組,400隻是定義一個上限 */
CvPoint2D32f frame1_features[400];
int number_of_features = 400;

/*開始跑shi-tomasi函數*/
cvGoodFeaturesToTrack(frame1_1C, eig_image, temp_image,
frame1_features, &number_of_features, .01, .01, NULL);

/**********************************************************
開始金字塔Lucas Kanade光流法,該演算法主要用於feature tracking,即是算出
光流,並跟蹤目標。
input:
* "frame1_1C" 輸入圖像,即8位灰色的第一幀
* "frame2_1C" 第二幀,我們要在其上找出第一幀我們發現的特徵點在第二幀
的什麼位置
* "pyramid1" and "pyramid2" 是提供給該演算法可操作的內存區域,計算中間
數據
* "frame1_features" 由shi-tomasi演算法得到的第一幀的特徵點.
* "number_of_features" 第一幀特徵點的數目
* "optical_flow_termination_criteria" 該演算法中迭代終止的判別,這里是
epsilon<0.3,epsilon是兩幀中對應特徵窗口的光度之差的平方,這個以後的文
章會講
* "0" 這個我不知道啥意思,反正改成1就出不來光流了,就用作者原話解釋把
means disable enhancements. (For example, the second array isn't
pre-initialized with guesses.)
output:
* "frame2_features" 根據第一幀的特徵點,在第二幀上所找到的對應點
* "optical_flow_window" lucas-kanade光流演算法的運算窗口,具體lucas-kanade
會在下一篇詳述
* "5" 指示最大的金字塔層數,0表示只有一層,那就是沒用金字塔演算法
* "optical_flow_found_feature" 用於指示在第二幀中是否找到對應特徵值,
若找到,其值為非零
* "optical_flow_feature_error" 用於存放光流誤差
**********************************************************/

/*開始為pyramid lucas kanade光流演算法輸入做准備*/
CvPoint2D32f frame2_features[400];

/* 該數組相應位置的值為非零,如果frame1中的特徵值在frame2中找到 */
char optical_flow_found_feature[400];

/* 數組第i個元素表對應點光流誤差*/
float optical_flow_feature_error[400];

/*lucas-kanade光流法運算窗口,這里取3*3的窗口,可以嘗試下5*5,區別就是5*5
出現aperture problem的幾率較小,3*3運算量小,對於feature selection即shi-tomasi演算法來說足夠了*/
CvSize optical_flow_window = cvSize(5, 5);
// CvSize optical_flow_window = cvSize(5, 5);
/* 終止規則,當完成20次迭代或者當epsilon<=0.3,迭代終止,可以嘗試下別的值*/
CvTermCriteria optical_flow_termination_criteria= cvTermCriteria(CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, .3);

/*分配工作區域*/
allocateOnDemand(&pyramid1, frame_size, IPL_DEPTH_8U, 1);
allocateOnDemand(&pyramid2, frame_size, IPL_DEPTH_8U, 1);

/*開始跑該演算法*/
cvCalcOpticalFlowPyrLK(frame1_1C, frame2_1C, pyramid1, pyramid2,frame1_features, frame2_features, number_of_features,
optical_flow_window, 5, optical_flow_found_feature,optical_flow_feature_error, optical_flow_termination_criteria, 0);

/*畫光流場,畫圖是依據兩幀對應的特徵值,
這個特徵值就是圖像上我們感興趣的點,如邊緣上的點P(x,y)*/
for (int i = 0; i< number_of_features; i++)
{
/* 如果沒找到對應特徵點 */
if (optical_flow_found_feature[i] == 0)
continue;
int line_thickness;
line_thickness = 1;

/* CV_RGB(red, green, blue) is the red, green, and blue components
* of the color you want, each out of 255.
*/
CvScalar line_color;
line_color = CV_RGB(255, 0, 0);

/*畫箭頭,因為幀間的運動很小,所以需要縮放,不然看不見箭頭,縮放因子為3*/
CvPoint p, q;
p.x = (int)frame1_features[i].x;
p.y = (int)frame1_features[i].y;
q.x = (int)frame2_features[i].x;
q.y = (int)frame2_features[i].y;

double angle;
angle = atan2((double)p.y - q.y, (double)p.x - q.x);
double hypotenuse;
hypotenuse = sqrt(square(p.y - q.y) + square(p.x - q.x));

/*執行縮放*/
q.x = (int)(p.x - 5 * hypotenuse * cos(angle));
q.y = (int)(p.y - 5 * hypotenuse * sin(angle));

/*畫箭頭主線*/
/* "frame1"要在frame1上作畫.
* "p" 線的開始點.
* "q" 線的終止點.
* "CV_AA" 反鋸齒.
* "0" 沒有小數位.
*/
cvLine(frame1, p, q, line_color, line_thickness, CV_AA, 0);

/* 畫箭的頭部*/
p.x = (int)(q.x + 9 * cos(angle + pi / 4));
p.y = (int)(q.y + 9 * sin(angle + pi / 4));
cvLine(frame1, p, q, line_color, line_thickness, CV_AA, 0);
p.x = (int)(q.x + 9 * cos(angle - pi / 4));
p.y = (int)(q.y + 9 * sin(angle - pi / 4));
cvLine(frame1, p, q, line_color, line_thickness, CV_AA, 0);
}
/*顯示圖像*/

/*創建一個名為optical flow的窗口,大小自動改變*/
cvNamedWindow("Optical Flow", CV_WINDOW_NORMAL);
cvFlip(frame1, NULL, 2);
cvShowImage("Optical Flow", frame1);

/*延時,要不放不了*/
cvWaitKey(33);

/*寫入到文件中去*/

// cv::Mat m = cv::cvarrToMat(frame1);//轉換lpimgae到mat格式
// writer << m;//opencv3.0 version writer

}
cap.release();
cvWaitKey(33);
system("pause");
}

2. SIFT特徵的原理

SIFT特徵不只具有尺度不變性,即使改變圖像的旋轉角度,亮度或拍攝視角,仍然能夠得到好的檢測效果。

這是一個初始化操作,尺度空間理論目的是模擬圖像數據的多尺度特徵。高斯卷積核是實現尺度變換的唯一線性核,於是一副二維圖像的尺度空間定義為:

下圖所示不同σ下圖像尺度空間:

關於尺度空間的理解說明:2kσ中的2是必須的,尺度空間是連續的。在 Lowe的論文中 ,將第0層的初始尺度定為1.6(最模糊),圖片的初始尺度定為0.5(最清晰). 在檢測極值點前對原始圖像的高斯平滑以致圖像丟失高頻信息,所以 Lowe 建議在建立尺度空間前首先對原始圖像長寬擴展一倍,以保留原始圖像信息,增加特徵點數量。尺度越大圖像越模糊。

圖像金字塔的建立:對於一幅圖像I,建立其在不同尺度(scale)的圖像,也成為子八度(octave),這是為了scale-invariant,也就是在任何尺度都能夠有對應的特徵點,第一個子八度的scale為原圖大小,後面每個octave為上一個octave降采樣的結果,即原圖的1/4(長寬分別減半),構成下一個子八度(高一層金字塔)。

注意:使用Difference of Gaussian圖像的極大極小值近似尋找特徵點計算簡單,是尺度歸一化的LoG運算元的近似

為了尋找尺度空間的極值點,每一個采樣點要和它所有的相鄰點比較,看其是否比它的圖像域和尺度域的相鄰點大或者小。
一個點如果在DOG尺度空間本層以及上下兩層的26個領域中是最大或最小值時,就認為該點是圖像在該尺度下的一個特徵點,如圖所示。

整個高斯金字塔如下圖所示,其中每個Octave代表一個金字塔,同一個金字塔內圖像尺寸一樣,同一個金字塔內每張圖通過不同的高斯卷積核產生。

在極值比較的過程中,每一組圖像的首末兩層是無法進行極值比較的,為了滿足尺度變化的連續性,我們在每一組圖像的頂層繼續用高斯模糊生成了 3 幅圖像,高斯金字塔有每組S+3層圖像。DOG金字塔每組有S+2層圖像。

使用Laplacian of Gaussian能夠很好地找到找到圖像中的興趣點,但是需要大量的計算量,所以使用Difference of Gaussian圖像的極大極小值近似尋找特徵點.DOG運算元計算簡單,是尺度歸一化的LoG運算元的近似,有關DOG尋找特徵點的介紹及方法詳見 http://blog.csdn.net/abcjennifer/article/details/7639488 ,極值點檢測用的Non-Maximal Suppression。

這一步本質上要去掉DoG局部曲率非常不對稱的像素。(不理解)

通過擬和三維二次函數以精確確定關鍵點的 位置 和 尺度 (達到亞像素精度),同時去除低對比度的關鍵點和不穩定的邊緣響應點(因為DoG運算元會產生較強的邊緣響應),以增強匹配穩定性、提高抗雜訊能力,在這里使用近似Harris Corner檢測器。
計算過程摘錄如下:(還沒有自行推導)
①空間尺度函數泰勒展開式如下:

的值在兩個特徵值相等的時候最小,隨著r的增大而增大,因此,為了檢測主曲率是否在某域值r下,只需檢測

if (α+β)/ αβ> (r+1)2
/r, throw it out. 在Lowe的文章中,取r=10。

上一步中確定了每幅圖中的特徵點,為每個特徵點計算一個方向,依照這個方向做進一步的計算, 利用關鍵點鄰域像素的梯度方向分布特性為每個關鍵點指定方向參數,使運算元具備旋轉不變性。

梯度直方圖的范圍是0~360度,其中每10度一個柱,總共36個柱。隨著距 中心點越遠的領域其對直方圖的貢獻也響應減小。Lowe論文中還提到要使用高斯函數對直方圖進行平滑,減少突變的影響。這主要是因為SIFT演算法只考慮了尺度和旋轉不變形,沒有考慮仿射不變性。通過高斯平滑,可以使關鍵點附近的梯度幅值有較大權重,從而部分彌補沒考慮仿射不變形產生的特徵點不穩定。
通常離散的梯度直方圖要進行插值擬合處理,以求取更精確的方向角度值。

在實際計算時,我們在以關鍵點為中心的鄰域窗口內采樣,並用直方圖統計鄰域像素的梯度方向。梯度直方圖的范圍是0~360度,其中每45度一個柱,總共8個柱, 或者每10度一個柱,總共36個柱。Lowe論文中還提到要使用高斯函數對直方圖進行平滑,減少突變的影響。直方圖的峰值則代表了該關鍵點處鄰域梯度的主方向,即作為該關鍵點的方向。

直方圖中的峰值就是主方向,其他的達到最大值80%的方向可作為輔助方向

Identify peak and assign orientation and sum of magnitude to key point.
** The user may choose a threshold to exclude key points based on their** assigned sum of magnitudes.

直方圖峰值代表該關鍵點處鄰域內圖像梯度的主方向,也就是該 關鍵點的主方向 。在梯度方向直方圖中,當存在另一個相當於主峰值 80%能量的峰值時,則將這個方向認為是該 關鍵點的輔方向 。所以一個關鍵點可能檢測得到多個方向,這可以增強匹配的魯棒性。Lowe的論文指出大概有15%關鍵點具有多方向,但這些點對匹配的穩定性至為關鍵。
獲得圖像關鍵點主方向後,每個關鍵點有三個信息(x,y,σ,θ):位置、尺度、方向。由此我們可以確定一個SIFT特徵區域。通常使用一個帶箭頭的圓或直接使用箭頭表示SIFT區域的三個值:中心表示特徵點位置,半徑表示關鍵點尺度(r=2.5σ),箭頭表示主方向。具有多個方向的關鍵點可以復製成多份,然後將方向值分別賦給復制後的關鍵點。如下圖:

通過對關鍵點周圍圖像區域分塊,計算塊內梯度直方圖,生成具有獨特性的向量,這個向量是該區域圖像信息的一種抽象,具有唯一性。

首先將坐標軸旋轉為關鍵點的方向,以確保旋轉不變性。以關鍵點為中心取8×8的窗口。

Figure.16*16的圖中其中1/4的特徵點梯度方向及scale,右圖為其加權到8個主方向後的效果。
圖左部分的中央為當前關鍵點的位置,每個小格代表關鍵點鄰域所在尺度空間的一個像素,利用公式求得每個像素的梯度幅值與梯度方向,箭頭方向代表該像素的梯度方向,箭頭長度代表梯度模值,然後用高斯窗口對其進行加權運算。

圖中藍色的圈代表高斯加權的范圍(越靠近關鍵點的像素梯度方向信息貢獻越大)。然後在每4×4的小塊上計算8個方向的梯度方向直方圖,繪制每個梯度方向的累加值,即可形成一個種子點,如圖右部分示。此圖中一個關鍵點由2×2共4個種子點組成,每個種子點有8個方向向量信息。這種鄰域方向性信息聯合的思想增強了演算法抗雜訊的能力,同時對於含有定位誤差的特徵匹配也提供了較好的容錯性。

計算keypoint周圍的16*16的window中每一個像素的梯度,而且使用高斯下降函數降低遠離中心的權重。

在每個4 4的1/16象限中,通過加權梯度值加到直方圖8個方向區間中的一個,計算出一個梯度方向直方圖。
這樣就可以對每個feature形成一個4 4 8=128維的描述子,每一維都可以表示4 4個格子中一個的scale/orientation. 將這個向量歸一化之後,就進一步去除了光照的影響。

生成了A、B兩幅圖的描述子,(分別是k1 128維和k2 128維),就將兩圖中各個scale(所有scale)的描述子進行匹配,匹配上128維即可表示兩個特徵點match上了。

實際計算過程中,為了增強匹配的穩健性,Lowe建議對每個關鍵點使用4×4共16個種子點來描述,這樣對於一個關鍵點就可以產生128個數據,即最終形成128維的SIFT特徵向量。此時SIFT特徵向量已經去除了尺度變化、旋轉等幾何變形因素的影響,再繼續將特徵向量的長度歸一化,則可以進一步去除光照變化的影響。 當兩幅圖像的SIFT特徵向量生成後,下一步我們採用關鍵點特徵向量的歐式距離來作為兩幅圖像中關鍵點的相似性判定度量。取圖像1中的某個關鍵點,並找出其與圖像2中歐式距離最近的前兩個關鍵點,在這兩個關鍵點中,如果最近的距離除以次近的距離少於某個比例閾值,則接受這一對匹配點。降低這個比例閾值,SIFT匹配點數目會減少,但更加穩定。為了排除因為圖像遮擋和背景混亂而產生的無匹配關系的關鍵點,Lowe提出了比較最近鄰距離與次近鄰距離的方法,距離比率ratio小於某個閾值的認為是正確匹配。因為對於錯誤匹配,由於特徵空間的高維性,相似的距離可能有大量其他的錯誤匹配,從而它的ratio值比較高。Lowe推薦ratio的閾值為0.8。但作者對大量任意存在尺度、旋轉和亮度變化的兩幅圖片進行匹配,結果表明ratio取值在0. 4~0. 6之間最佳,小於0. 4的很少有匹配點,大於0. 6的則存在大量錯誤匹配點。(如果這個地方你要改進,最好給出一個匹配率和ration之間的關系圖,這樣才有說服力)作者建議ratio的取值原則如下:
ratio=0. 4對於准確度要求高的匹配;ratio=0. 6對於匹配點數目要求比較多的匹配; ratio=0. 5一般情況下。也可按如下原則:當最近鄰距離<200時ratio=0. 6,反之ratio=0. 4。ratio的取值策略能排分錯誤匹配點。

當兩幅圖像的SIFT特徵向量生成後,下一步我們採用關鍵點特徵向量的歐式距離來作為兩幅圖像中關鍵點的相似性判定度量。取圖像1中的某個關鍵點,並找出其與圖像2中歐式距離最近的前兩個關鍵點,在這兩個關鍵點中,如果最近的距離除以次近的距離少於某個比例閾值,則接受這一對匹配點。降低這個比例閾值,SIFT匹配點數目會減少,但更加穩定。

3. 圖像集合變換第幾

一、改變色彩空間:
1.最常用的顏色轉換方法:BGR和GRAY、BGR和HSV
2.對象追蹤:給出想要追蹤的對象的顏色,就可以提取該對象。需要先將其轉換為HSV顏色空間。

二、圖像集合變換:
可以實現:
1.縮放(resize)
2.平移、旋轉、仿射變換(warpAffine)
3.透視變換(warpPerspective)

三、圖像閾值:
1.簡單閾值:
用來二分化圖像。
2.自適應閾值:
對於有著不同照明條件的圖像,用簡單閾值明顯不太合適,這時可以使用自適應閾值。
3.大津二值化:
在這個方法中可以不給出具體的閾值而是讓其自動找到一個合適的閾值。

四、平滑圖像
1.平均
通過將圖像和盒式濾波器進行卷積來完成的,取內核區域下所有像素的平均值並替換中心元素。我們應該指定內核的寬度和高度。
2.高斯模糊
使用高斯核來替代盒式濾波器,同樣指定它的寬度和高度(應為正數和奇數)。還可以指定X和Y方向的標准偏差(?),如果兩者都為零則跟根據內核大小自動計算。高斯模糊對於圖像去除高斯噪音非常有效。
3.中值模糊
這里,函數cv.medianBlur()取內核區域下所有像素的中值,並將中心元素(?)替換為該中值。這對圖像中的椒鹽雜訊非常有效。有趣的是,在之前的過濾器中,中心元素是新計算的值(可能是原圖像中的像素值或新值),但是在中值模糊中,中心元素總是被圖像中的某個像素值替換。它有效地降低了噪音。它的內核大小應該是一個正奇數。
4.雙邊過濾
雙邊過濾可以解決高斯模糊總會模糊邊緣的不足。雙邊過濾也在空間上採用高斯濾波器,但多了一個用於像素差的函數的高斯濾波器。前者確保只考慮附近的像素進行模糊處理;而後者只考慮那些與中心像素具有相似強度的像素進行模糊處理。因為邊緣處的像素會有很大的強度變化,所以它保留了邊緣。

五、形態變換
1.侵蝕
內核在圖像中滑動,只有當內核區域中的所有像素都為1時,該區域中的一個像素(1或0)才會被認為是1,否則它會被侵蝕(變為0)。即根據內核大小前景物體的邊緣會被丟棄(即1變為0,白變黑),具體表現為前景物體的厚度增大或減少,或者是圖像中的白色區域變化。
2.擴張
與侵蝕相反,如果內核區域內的至少一個像素為1,則該區域都為1。通常用於侵蝕消除了白雜訊後,可以再將其擴張到原來大小,噪音就消失了。
3.opening
先侵蝕再擴張,可用於消除前景物體以外的小白點。
4.closing
先擴張再侵蝕,可用於消除前景物體的小孔或小黑點。
5.形態梯度
生成前景物體的輪廓。
6.top hat
輸出原圖和opening後的差異。
7.black hat
輸出原圖和closing後的差異。
8.getStructuringElement
生成圓形、橢圓形或十字形的內核。(長方形可由Numpy創建)

六、Image Gradients(?)
使用Soble、Scharr、Laplacian導數來銳化圖像。

七、Canny 邊緣檢測
這是一個多階段演算法。
1.降噪:由於邊緣檢測容易受到圖像中雜訊的影響,因此第一步是使用 5x5 高斯濾波器去除圖像中的雜訊。
2.尋找圖像的強度梯度:然後在水平和垂直方向上使用 Sobel 內核對平滑後的圖像進行濾波,以獲得水平方向的一階導數和垂直方向。
3.非最大抑制:在獲得梯度幅度和方向後,對圖像進行全面掃描以去除可能不構成邊緣的任何不需要的像素。為此,在每個像素處,檢查像素是否是其鄰域中沿梯度方向的局部最大值。
4.遲滯閾值:這個階段決定哪些所有的邊都是真正的邊,哪些不是。為此,我們需要兩個閾值 minVal 和 maxVal。任何強度梯度大於 maxVal 的邊緣肯定是邊緣,低於 minVal 的邊緣肯定是非邊緣,因此丟棄。位於這兩個閾值之間的那些根據它們的連通性被分類為邊緣或非邊緣。如果它們連接到「確定邊緣」像素,則它們被認為是邊緣的一部分。否則,它們也會被丟棄。

八、圖像金字塔(代碼?)
在搜索圖像中的某些內容時,例如人臉,我們不確定該對象在所述圖像中的大小。在這種情況下,我們需要創建一組具有不同解析度的相同圖像並在所有圖像中搜索對象。這些具有不同解析度的圖像集稱為圖像金字塔。
拉普拉斯金字塔是由高斯金字塔形成的。沒有專門的功能。拉普拉斯金字塔圖像僅類似於邊緣圖像。它的大部分元素都是零。它們用於圖像壓縮。拉普拉斯金字塔中的一個級別是由高斯金字塔中的該級別與高斯金字塔中其上層的擴展版本之間的差異形成的。
金字塔的一種應用是圖像混合。例如,在圖像拼接中,您需要將兩張圖像堆疊在一起,但由於圖像之間的不連續性,它可能看起來不太好。在這種情況下,使用金字塔進行圖像混合可為您提供無縫混合,而不會在圖像中留下太多數據。

九、模板匹配
模板匹配是一種在較大圖像中搜索和查找模板圖像位置的方法。為此,OpenCV 附帶了一個函數cv.matchTemplate()。它只是將模板圖​​像滑到輸入圖像上(如在 2D 卷積中),並在模板圖像下比較輸入圖像的模板和補丁。OpenCV 中實現了幾種比較方法。它返回一個灰度圖像,其中每個像素表示該像素的鄰域與模板匹配的程度。
假設您正在搜索一個多次出現的對象,cv.minMaxLoc()不會為您提供所有位置。在這種情況下,我們將使用閾值。

4. ERDAS軟體如何進行金字塔演算法的融合ENVI、PCI有沒有這項功能! 急急急!!!

沒明白你的問題 erdas提供很多融合演算法 金字塔只是為了加速圖像顯示

5. [圖像演算法]-Faster RCNN詳解

paper: Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
Tensorflow-faster r-cnn github: Tensorflow Faster RCNN for Object Detection

faster rcnn是何凱明等大神在2015年提出目標檢測演算法,該演算法在2015年的ILSVRV和COCO競賽中獲得多項第一。該演算法在fast rcnn基礎上提出了RPN候選框生成演算法,使得目標檢測速度大大提高。

(1)image input;
(2)利用selective search 演算法在圖像中從上到下提取2000個左右的Region Proposal;
(3)將每個Region Proposal縮放(warp)成227*227的大小並輸入到CNN,將CNN的fc7層的輸出作為特徵;
(4)將每個Region Proposal提取的CNN特徵輸入到SVM進行分類;
(5)對於SVM分好類的Region Proposal做邊框回歸,用Bounding box回歸值校正原來的建議窗口,生成預測窗口坐標.
缺陷:
(1) 訓練分為多個階段,步驟繁瑣:微調網路+訓練SVM+訓練邊框回歸器;
(2) 訓練耗時,佔用磁碟空間大;5000張圖像產生幾百G的特徵文件;
(3) 速度慢:使用GPU,VGG16模型處理一張圖像需要47s;
(4) 測試速度慢:每個候選區域需要運行整個前向CNN計算;
(5) SVM和回歸是事後操作,在SVM和回歸過程中CNN特徵沒有被學習更新.

(1)image input;
(2)利用selective search 演算法在圖像中從上到下提取2000個左右的建議窗口(Region Proposal);
(3)將整張圖片輸入CNN,進行特徵提取;
(4)把建議窗口映射到CNN的最後一層卷積feature map上;
(5)通過RoI pooling層使每個建議窗口生成固定尺寸的feature map;
(6)利用Softmax Loss(探測分類概率) 和Smooth L1 Loss(探測邊框回歸)對分類概率和邊框回歸(Bounding box regression)聯合訓練.

相比R-CNN,主要兩處不同:
(1)最後一層卷積層後加了一個ROI pooling layer;
(2)損失函數使用了多任務損失函數(multi-task loss),將邊框回歸直接加入到CNN網路中訓練
改進:
(1) 測試時速度慢:R-CNN把一張圖像分解成大量的建議框,每個建議框拉伸形成的圖像都會單獨通過CNN提取特徵.實際上這些建議框之間大量重疊,特徵值之間完全可以共享,造成了運算能力的浪費.
FAST-RCNN將整張圖像歸一化後直接送入CNN,在最後的卷積層輸出的feature map上,加入建議框信息,使得在此之前的CNN運算得以共享.
(2) 訓練時速度慢:R-CNN在訓練時,是在採用SVM分類之前,把通過CNN提取的特徵存儲在硬碟上.這種方法造成了訓練性能低下,因為在硬碟上大量的讀寫數據會造成訓練速度緩慢.
FAST-RCNN在訓練時,只需要將一張圖像送入網路,每張圖像一次性地提取CNN特徵和建議區域,訓練數據在GPU內存里直接進Loss層,這樣候選區域的前幾層特徵不需要再重復計算且不再需要把大量數據存儲在硬碟上.
(3) 訓練所需空間大:R-CNN中獨立的SVM分類器和回歸器需要大量特徵作為訓練樣本,需要大量的硬碟空間.FAST-RCNN把類別判斷和位置回歸統一用深度網路實現,不再需要額外存儲.
(4) 由於ROI pooling的提出,不需要再input進行Corp和wrap操作,避免像素的損失,巧妙解決了尺度縮放的問題.

(1)輸入測試圖像;
(2)將整張圖片輸入CNN,進行特徵提取;
(3)用RPN先生成一堆Anchor box,對其進行裁剪過濾後通過softmax判斷anchors屬於前景(foreground)或者後景(background),即是物體or不是物體,所以這是一個二分類;同時,另一分支bounding box regression修正anchor box,形成較精確的proposal(註:這里的較精確是相對於後面全連接層的再一次box regression而言)
(4)把建議窗口映射到CNN的最後一層卷積feature map上;
(5)通過RoI pooling層使每個RoI生成固定尺寸的feature map;
(6)利用Softmax Loss(探測分類概率) 和Smooth L1 Loss(探測邊框回歸)對分類概率和邊框回歸(Bounding box regression)聯合訓練.

相比FASTER-RCNN,主要兩處不同:
(1)使用RPN(Region Proposal Network)代替原來的Selective Search方法產生建議窗口;
(2)產生建議窗口的CNN和目標檢測的CNN共享

改進:
(1) 如何高效快速產生建議框?
FASTER-RCNN創造性地採用卷積網路自行產生建議框,並且和目標檢測網路共享卷積網路,使得建議框數目從原有的約2000個減少為300個,且建議框的質量也有本質的提高.

從上面的三張圖可以看出,Faster R CNN由下面幾部分組成:
1.數據集,image input
2.卷積層CNN等基礎網路,提取特徵得到feature map
3-1.RPN層,再在經過卷積層提取到的feature map上用一個3x3的slide window,去遍歷整個feature map,在遍歷過程中每個window中心按rate,scale(1:2,1:1,2:1)生成9個anchors,然後再利用全連接對每個anchors做二分類(是前景還是背景)和初步bbox regression,最後輸出比較精確的300個ROIs。
3-2.把經過卷積層feature map用ROI pooling固定全連接層的輸入維度。
4.然後把經過RPN輸出的rois映射到ROIpooling的feature map上進行bbox回歸和分類。

SPP-Net是出自論文《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》
由於一般的網路結構中都伴隨全連接層,全連接層的參數就和輸入圖像大小有關,因為它要把輸入的所有像素點連接起來,需要指定輸入層神經元個數和輸出層神經元個數,所以需要規定輸入的feature的大小。而SPP-NET正好解決了這個問題。

如果原圖輸入是224x224,對於conv5出來後的輸出,是13x13x256的,可以理解成有256個這樣的filter,每個filter對應一張13x13的activation map.如果像上圖那樣將activation map pooling成4x4 2x2 1x1三張子圖,做max pooling後,出來的特徵就是固定長度的(16+4+1)x256那麼多的維度了.如果原圖的輸入不是224x224,出來的特徵依然是(16+4+1)x256;直覺地說,可以理解成將原來固定大小為(3x3)窗口的pool5改成了自適應窗口大小,窗口的大小和activation map成比例,保證了經過pooling後出來的feature的長度是一致的.

總結而言,當網路輸入的是一張任意大小的圖片,這個時候我們可以一直進行卷積、池化,直到網路的倒數幾層的時候,也就是我們即將與全連接層連接的時候,就要使用金字塔池化,使得任意大小的特徵圖都能夠轉換成固定大小的特徵向量,這就是空間金字塔池化的意義(多尺度特徵提取出固定大小的特徵向量)。

ROI pooling layer實際上是SPP-NET的一個精簡版,SPP-NET對每個proposal使用了不同大小的金字塔映射,而ROI pooling layer只需要下采樣到一個7x7的特徵圖.對於VGG16網路conv5_3有512個特徵圖,這樣所有region proposal對應了一個7*7*512維度的特徵向量作為全連接層的輸入.

為什麼要pooling成7×7的尺度?是為了能夠共享權重。Faster RCNN除了用到VGG前幾層的卷積之外,最後的全連接層也可以繼續利用。當所有的RoIs都被pooling成(512\×7\×7)的feature map後,將它reshape 成一個一維的向量,就可以利用VGG16預訓練的權重,初始化前兩層全連接.

那麼經過何種變換才能從圖11中的窗口P變為窗口呢?比較簡單的思路就是:

注意:只有當Proposal和Ground Truth比較接近時(線性問題),我們才能將其作為訓練樣本訓練我們的線性回歸模型,否則會導致訓練的回歸模型不work(當Proposal跟GT離得較遠,就是復雜的非線性問題了,此時用線性回歸建模顯然不合理).這個也是G-CNN: an Iterative Grid Based Object Detector多次迭代實現目標准確定位的關鍵. 線性回歸就是給定輸入的特徵向量X,學習一組參數W,使得經過線性回歸後的值跟真實值Y(Ground Truth)非常接近.即.那麼Bounding-box中我們的輸入以及輸出分別是什麼呢?

如上圖中標識:
① rpn_cls:60*40*512-d ⊕ 1*1*512*18 > 60*40*92 逐像素對其9個Anchor box進行二分類
② rpn_bbox:60*40*512-d ⊕ 1*1*512*36>60*40*9*4 逐像素得到其9個Anchor box四個坐標信息

逐像素對Anchors分類標記
① 去除掉超過1000*600這原圖的邊界的anchor box
② 如果anchor box與ground truth的IoU值最大,標記為正樣本,label=1
③ 如果anchor box與ground truth的IoU>0.7,標記為正樣本,label=1
④ 如果anchor box與ground truth的IoU<0.3,標記為負樣本,label=0
剩下的既不是正樣本也不是負樣本,不用於最終訓練,label=-1

逐像素Bbox回歸糾正
除了對anchor box進行標記外,另一件事情就是計算anchor box與ground truth之間的偏移量
令:ground truth:標定的框也對應一個中心點位置坐標x ,y 和寬高w ,h
anchor box: 中心點位置坐標x_a,y_a和寬高w_a,h_a
所以,偏移量:
△x=(x -x_a)/w_a △y=(y -y_a)/h_a
△w=log(w /w_a) △h=log(h /h_a)
通過ground truth box與預測的anchor box之間的差異來進行學習,從而是RPN網路中的權重能夠學習到預測box的能力

接著進一步對Anchors進行越界剔除和使用nms非最大值抑制,剔除掉重疊的框;比如,設定IoU為0.7的閾值,即僅保留覆蓋率不超過0.7的局部最大分數的box(粗篩)。最後留下大約2000個anchor,然後再取前N個box(比如300個);這樣,進入到下一層ROI Pooling時region proposal大約只有300個。

參考文獻:

6. viola jones人臉檢測原理

Viola-jones人臉檢測演算法是一種基於滑動窗口的目標檢測演算法,但它卻克服了滑動窗口檢測帶來的低效問題,可以用於實時人臉檢測,主要歸功於以下三點:

我參考論文[1]實現了Viola Jones中提到的attention cascade檢測框架,此處是 github傳送門 。

下面進一步詳細介紹整個檢測原理。

基於滑窗的目標檢測基本原理很簡單,首先構建一個classifier(分類器),以人臉檢測為例,分類器的工作是判斷給定大小的圖像的是否為人臉,用該分類器從左至右從上到下掃描整幅圖像,掃描獲取的部分圖像稱為子窗(文章中子窗大小為24x24像素),當分類器判斷子窗是人臉時,即完成了人臉檢測。

這樣處理有個問題,如果圖像中包含的人臉變大了,此時採用固定大小的子窗就無法進行檢測。通常有兩種解決方法,1. 採用image-pyramid(圖像金字塔),也就是通過resize獲得多種不同大小圖像並堆疊在一起,用固定大小分類器同時對所有圖像進行掃描;2. 採用不同大小的分類器進行掃描。文章中用到的是第二種方法,盡管如此,雖然避免了調整圖像大小帶來的計算開銷,但不同大小的分類器意味著有更多子窗需要進行處理。

如何構建一個足夠快的分類器來對每個子窗進行快速判斷。

分類器的構建有兩種方式,一種是pixel-based(基於像素),另一種是feature-based(基於特徵)。當把神經網路作為圖像分類器時,輸入是圖像的像素值,即基於像素的分類器。用圖像像素作為輸入不包含任何和待分類目標有關的特定信息,往往訓練這種分類器需要大量數據,並且分類過程較慢。基於特徵的分類器就是先針對圖像進行特徵提取(HOG特徵,SIFT特徵等),再利用獲取的特徵進行分類。這種分類器不需要大量訓練數據,且計算量一般會在特徵計算部分,相對較小。

文章採用的是基於特徵的分類器,選取了一種較為簡單的特徵即haar-like特徵。利用矩形個數對可以將haar-like特徵分為三類,分別由兩個,三個,和四個 大小相同 的矩形組成。全部列舉出來可以分為以下(a)(b)(c)(d)(e)五類(注意是五類不是五個,具體有多少個haar-like特徵是由子窗大小決定的)。如下圖所示(文章[1]中的圖)。

當子窗大小給定後,我們可以用五個參數唯一確定 一個 haar-like特徵,即特徵種類(a/b/c/d/e),左上角x軸坐標,左上角y軸坐標,矩形的長,矩形的寬。對應的特徵值等於位於白色矩形框中像素值總和減去位於黑色矩形框中的像素值總和。文章中用到的子窗大小為24x24像素,可以計算出來總共有162336個特徵(把在子窗中所有可能位置和可能大小的特徵全部列舉出來)。利用haar-like特徵進行分類只需兩步:

haar-like特徵有兩個優點,第一是它是scale-invariant(不隨圖片大小而改變)的,第二是可以通過積分圖像快速計算。簡單的說下第一點的含義,例如我們用24x24像素的訓練樣本訓練獲取一組haar-like特徵和對應的門限值,當對圖像進行掃描時,子窗大小調整為SxS像素,此時只需將特徵中的矩形大小按同樣比例進行縮放(門限值同樣需要縮放),計算所得的特徵值依然是有效的。
積分圖像是受卷積的微分性質啟發而定義一種數據結構。積分圖像定義:

其中 為積分圖像, 為原圖像。積分圖像中 位置處的像素值等於原圖中位於 的左側和上方的所有像素值之和。有了積分圖像我們就可以快速計算haar-like特徵,以特徵(a)為例,如下圖所示。

S1到S6是積分圖像在這六個頂點上的值。該特徵值等於位於A中的像素總和減去位於B中的像素總和,而A中像素總和等於S5+S1-S2-S4,B中像素總和等於S6+S2-S3-S5,並且無論矩形多大,我們總能在固定時間內計算出特徵值(6次索引操作和少量的加法乘法計算)。積分圖像只需計算一次後續可以一直使用,事實上在演算法實現時,我們只需保存樣本的積分圖像,原圖像反而不用保存。

現在找到了一類特徵用於構建分類器,和快速計算該類特徵的方法。分類器是由一組特徵構成的,而不是一個,如何找到一組有效的特徵。

文章列舉了前人的一些特徵選取方法(此處就不列舉了),它們雖然取得了一定的效果,但最終選出來的特徵數量還是太多。文章將adaBoost演算法用於特徵選取(創新點),即每次訓練的弱分類器的過程看做特徵選取的過程,一次從162336個特徵中選取一個特徵(同時還包括了對應的門限值,極性,加權誤差)。

adaboost演算法就不詳細介紹了,它的基本思想是訓練一系列「弱」分類器,組成一個committee(即每個弱分類器都有投票權,但是權重不同,加權誤差越小的弱分類器權重越大)。adaboost採用迭代訓練方式,給定一個t階committee,如何尋找第t+1個弱分類器和對應的權重,以最小化在一定分布下的訓練樣本的加權指數損失。這個優化過程可以轉換為對訓練樣本的分布進行調整(即增大上一輪錯誤判斷的樣本的權重,減小正確判斷的樣本權重),在調整後的樣本分布下尋找最小化加權0-1損失的弱分類器並計算對應的加權0-1損失。

可以利用adaboost找到一組特徵構成分類器,使得該分類器有極高的准確率和召回率(這種分類器勢必會有較大的計算量),這樣會導致圖像中的每一個子窗都享有同等的計算量,掃描一整幅圖會有幾十萬甚至上百萬子窗,總體計算量依然很大。實際上一幅圖像中只有極少可能包含人臉的位置是我們感興趣的,其他不包含人臉的子窗我們希望能夠快速篩除,將更精細的計算用於包含人臉的子窗。

文章引入了attention-cascade的機制(注意力級聯),即訓練多個分類器進行級聯,替代單一的分類器。結構如下圖所示(文章[3]中的圖)。

上圖所示的分類器有三級,上一級的輸出是下一級的輸入,只有預測為正的樣本才能傳遞給下一級,預測為負的樣本直接舍棄。大部分非人臉子窗往往在前幾級分類器就被舍棄,這樣使得掃描每個子窗所需的平均計算量大大減小。

分類器是一級一級訓練之後級聯起來的,訓練分類器時,整個級聯分類器的假負率(fpr_overall)有一個訓練目標(文章[1]中設置為10e-7),同時每一級有一對訓練目標,即假正率和假負率。每級分類器訓練的思想是在假負率極低的情況下(文章[1]中設置為0.005)盡量得到一個較低的假正率(文章中[1]中設置為0.5),即我們保證在正樣本盡可能多的通過該級分類器的情況下盡量篩除更多的負樣本。文章[3]通過一個鬆弛量來調節假正率和假負率。

下一級用到的訓練數據是由所有的正樣本和上一級輸出的假正樣本組成的,這樣訓練的好處是可以讓處於級聯後半部分的分類器「看到」更多負樣本數據,缺點是訓練後期假正樣本很難獲取,訓練時間會比較長。

盡管我們獲取了一個級聯分類器,但依然不能保證對同一幅圖中的一張人臉只會檢測到一次(子窗相對人臉有所便宜或者縮放子窗大小都可能導致重復檢測),如何消除重復檢測,獲得更好的檢測效果。

文章[3]中說的較為簡略,主要是針對檢測框構建並查集,並對並查集中的候選框求平均得出最終的檢測框。

文章[1]中是採用連通分量演算法,計算每種大小檢測框的置信度,根據置信度選取最終結果,但前提是檢測器在圖像中掃描的步進必須是1個像素,處理時間可能會比較長。

只能用於正臉檢測,如果人臉朝屏幕內外或者在屏幕平面上旋轉均有可能失效
在背景較亮,人臉較暗的情況下可能失效。
在有遮擋的情況下大概率失效。

7. 圖像配準的灰度信息

互相關法是最基本的基於灰度統計的圖像配準的方法,通常被用於進行模板匹配和模式識別。它是一種匹配度量,通過計算模板圖像和搜索窗口之間的互相關值,來確定匹配的程度,互相關值最大時的搜索窗口位置決定了模板圖像在待配准圖像中的位置。
設A圖像為參考圖像或基準圖像,表示為 ,B為要進行校正後與A配準的圖像,表示為 ,在A圖像中選擇幾塊包含特徵信息豐富的小區域 作模板 ,在 圖像重疊部分選擇一個重疊區域作為模板的搜索區域 ,並使得 ,即 ,如圖14-3所示。然後把每一個模板 放在與其對應的搜索區中,通過兩者的相對移動,在逐行逐列的每個位置上,計算 與其覆蓋的搜索區 中那部分之間的相似性,產生出表明兩者相似程度最大的函數值的位置 。設在待配准圖像B搜索到的相似區域為 ,再以 為模板,再用同樣的方法在參考圖像中去搜索相似程度最大的函數值的區域 ,設定一個閾值Z,如果 ,則認為 和 重合,B圖像中的位置 就是B圖像與A圖像 相匹配的位置;反之,則認為特徵區域匹配不正確,即偽匹配。兩幅圖像之間的相似度評測標准,可以採用不同的方法,主要有下面三種:
14-3 模板匹配示意圖圖
Fig.14-3 Sample image of template matching
A. 均方和
(14-7)
B. 蘭氏距離
(14-8)
C.歸一化標准相關系數
(14-9)
其中,在定義式中,
表示的是模板子圖像中第 行和第 列的像素的灰度值;
是匹配圖像中參考點 處的參考子圖像上的第 行和第 列的像素的灰度值;
和 分別代表兩個子圖像內像素灰度的均值;
而定義式的左邊各自代表模板子圖像 和另一個圖像中的參考點 處的子圖像 的相似性測度。
這三個公式中,前兩個的極小值代表了可能的匹配位置,後一個公式的極大值代表了可能的匹配位置。其它的一些評測標准都是由這些基本的評測標准引申出來的。如相關系數和標准相關系數都是歸一化標准相關系數的簡化形式,從本質上都是相同的。
序貫相似度檢測匹配法(SSDA)
序貫相似度檢測匹配法(Sequential Similarity Detection Algorithms,SSDA)是由Barnea等人提出來的。SSDA方法的最主要的特點是處理速度快。該方法先選擇一個簡單的固定門限T,若在某點上計算兩幅圖像殘差和的過程中,殘差和大於該固定門限T,就認為當前點不是匹配點,從而終止當前的殘差和的計算,轉向別的點去計算殘差和,最後認為殘差和增長最慢的點就是匹配點。 這種方法的基本思想是基於對誤差的積累進行分析。所以對於大部分非匹配點來說,只需計算模板中的前幾個像素點,而只有匹配點附近的點才需要計算整個模板。這樣平均起來每一點的運算次數將遠遠小於實測圖像的點數,從而達到減少整個匹配過程計算量的目的。
在SSDA演算法中,參考圖像與待配准圖像之間的相似度評測標準是通過函數 來度量的,公式如下:
(14-10)
其中殘差和 ,坐標是從待配准圖像中,隨機抽取得到的非重復的點坐標序列。 越大,表示誤差增長越慢,即兩幅圖像越相似。這種方法的關鍵是閾值T的選擇,它不僅影響到演算法的運算速度,同時還影響到演算法的匹配精度。 交互信息法最初是Viola等人於1995年把交互信息引入到圖像配準的領域的,它是基於信息理論的交互信息相似性准則。初衷是為了解決多模態醫學圖像的配准問題。
交互信息用來比較兩幅圖像的統計依賴性。首先將圖像的灰度視作具有獨立樣本的空間均勻隨機過程,相關的隨機場可以採用高斯—馬爾科夫隨機場模型建立,用統計特徵及概率密度函數來描述圖像的統計性質。交互信息是兩個隨機變數A和B之間統計相關性的量度,或是一個變數包含另一個變數的信息量的量度。
交互信息 是用A和B的個體熵 和 和聯合熵 來表示:
(14-11)
其中:
這里 分別為隨機變數A和B的邊緣概率密度; 為兩個隨機變數的聯合概率密度分布。交互信息用於圖像配準的關鍵思想是:如果兩幅圖像達到匹配,它們的交互信息達到最大值。在圖像配准應用中,通常聯合概率密度和邊緣概率密度可以用兩幅圖像重疊區域的聯合概率直方圖和邊緣概率直方圖來估計,或者用Parzen窗概率密度估計法來估計,從而來計算交互信息。
交互信息圖像配准方法一經提出,有不少基於此類的研究,尤其在醫學圖像的配准問題上。比如將交互信息和梯度結合起來改善其極值性能的演算法、多解析度圖像金字塔法等等。但交互信息是建立在概率密度估計的基礎上的,有時需要建立參數化的概率密度模型,它要求的計算量很大,並且要求圖像之間有很大的重疊區域,由此函數可能出現病態,且有大量的局部極值。

8. 圖像處理

第三章 圖像處理

        輸出圖像的像素值僅僅由輸入圖像的像素值決定。

        1.1 像素變換

              根據像素產生輸出像素,注意,這里的像素可以是多副圖片的像素。

        1.2 顏色變換

              彩色圖像的各通道間具有很強的相關性。

        1.3 合成和映射

              將前景對象從圖像背景中提取出來,被稱為摳圖;將對象插入另一圖像被稱為合成。

        1.4 直方圖均衡化

            對比度和亮度參數可以提升圖像的外觀,為了自動調節這兩個參數,有兩種方法,一種方法是尋找圖像中最亮的值和最暗的值,將它們映射到純白和純黑,另一種方法是尋找圖像的像素平均值,將其作為像素的中間灰度值,然後充滿范圍盡量達到可顯示的值。

        局部自適應直方圖均衡化,對於不同的區域採用不同的均衡化方法。缺點是會產生區塊效應,即塊的邊界處亮度不連續,為了消除這一效應,常採用移動窗口,或者在塊與塊之間的轉換函數進行平滑插值。

        1.5 應用:色調調整

        點運算元的常用領域是對照片的對比度和色調進行操作。

        與點運算元相對應的鄰域運算元是根據選定像素及周圍的像素來決定該像素的 輸出。鄰域運算元不僅用於局部色調調整,還用於圖像平滑和銳化,圖像的去噪。

        鄰域運算元的重要概念是卷積和相關,它們都是線性移不變運算元,滿足疊加原理和移位不變原理。

        填塞,當卷積核超出圖像邊界時,會產生邊界效應。有多種填塞方法,0填塞,常數填塞,夾取填塞,重疊填塞,鏡像填塞,延長。

        2.1 可分濾波器

        如果一個卷積運算可以分解為一維行向量卷積和一維列向量卷積,則稱該卷積核可分離。2D核函數可以看作一個矩陣K,當且僅當K的第一個奇異值為0時,K可分離。

        2.2 線性濾波器舉例

        最簡單的濾波器是移動平均或方框濾波器,其次是雙線性濾波器(雙線性核),高斯濾波器(高斯核),以上均為低通核,模糊核,平滑核。對於這些核函數效果的度量採用傅里葉分析。還有Sobel運算元和角點運算元。

        2.3 帶通和導向濾波器

        Sobel運算元是帶方向的濾波器的近似,先用高斯核平滑圖像,再用方向導數(拉普拉斯運算元)作用於圖像,得到導向濾波器,導向具有潛在的局部性以及很好的尺度空間特性。導向濾波器常用來構造特徵描述子和邊緣檢測器,線性結構通常被認為是類似邊緣的。

        區域求和表是指一定區域內所有像素值的和,又稱為積分圖像,它的有效計算方法是遞歸演算法(光柵掃描演算法),區域求和表用於對其他卷積核的近似,人臉檢測中的多尺度特徵,以及立體視覺中的差分平方和的計算。

        遞歸濾波器稱為無限脈沖響應(IIR),有時用於二維距離函數和連通量的計算,也可計算大面積的平滑計算。

       

        3.1 非線性濾波器

        中值濾波可以去除散粒雜訊,它的另一個優點是保邊平滑,即在濾除高頻雜訊時,邊緣不容易被柔化。

        雙邊濾波器思想的精髓在於,抑制與中心像素值差別較大的像素,而不是抑制固定百分比 的像素。在加權濾波器的基礎上,對權重系數進行了控制,即取決於定義域核(高斯核)和值域核(與中心像素值的相似度),兩者相乘得到雙邊濾波器核。

        迭代自適應平滑核各項異性擴散。

        3.2 形態學

        非線性濾波常用於二值圖像處理,二值圖像中最常見的運算元是形態學運算元,將二值結構元素與二值圖像卷積,根據卷積結果的閾值選擇二值輸出,結構元素可以是任何形狀。

        常見的形態學操作有膨脹,腐蝕,過半,開運算,閉運算。過半使銳利的角變得平滑,開運算和閉運算去除圖像中小的點和孔洞,並使圖像平滑。

        3.3 距離變換

        距離變換通過使用兩遍光柵掃描法,快速預計算到曲線或點集的距離,包括城街距離變換和歐氏距離變換。符號距離變換是基本距離變換的擴展,計算了所有像素到邊界像素的距離。

        3.4 連通域

        檢測圖像的連通量是半全局的圖像操作,連通量定義為具有相同輸入值的鄰接像素的區域,二值或多值圖像被分割成連通量形式後,對每個單獨區域計算統計量,面積,周長,質心,二階矩,可用於區域排序和區域匹配。

          傅里葉變換用於對濾波器的頻域特徵進行分析,FFT能快速實現大尺度核的卷積。

          思想:為了分析濾波器的頻率特徵,將一個已知頻率的正弦波通過濾波器,觀察正弦波變弱的程度。傅里葉變換可認為是輸入信號為正弦信號s(x),經過濾波器h(x)後,產生的輸出響應為正弦信號o(x)=s(x)*h(x),即兩者的卷積。傅里葉變換是對每個頻率的幅度和相位響應的簡單羅列。傅里葉變換不僅可以用於濾波器,還能用於信號和圖像。

          傅里葉變換的性質:疊加,平移,反向,卷積,相關,乘,微分,定義域縮放,實值圖像,Parseval定理。

      4.1 傅里葉變換對

      常見的傅里葉變換對,連續的和離散的。方便進行傅里葉變換。

        高頻成分將在降采樣中導致混疊。

      4.2 二維傅里葉變換

        為了對二維圖像及濾波器進行處理,提出了二維傅里葉變換,與一維傅里葉變換類似,只不過用向量代替標量,用向量內積代替乘法。

        4.3 維納濾波器

        傅里葉變換還可用於分析一類圖像整體的頻譜,維納濾波器應運而生。假定這類圖像位於隨機雜訊場中,每個頻率的期望幅度通過功率譜給出,信號功率譜捕獲了空間統計量的一階描述。維納濾波器適用於去除功率譜為P的圖像雜訊的濾波器。

        維納濾波器的性質,對於低頻具有 單位增益,對於高頻,具有減弱的效果。

        離散餘弦變換(DCT)常用於處理以塊為單位的圖像壓縮,它的計算方法是將以N為寬度的塊內的像素與一系列不同頻率的餘弦值進行點積來實現。

        DCT變換的實質是對自然圖像中一些小的區域的最優KL分解(PCA主成分分析的近似),KL能有效對信號去相關。

        小波演算法和DCT交疊變種能有效去除區塊效應。

        4.4 應用:銳化,模糊,去噪

          銳化和去雜訊能有效增強圖像,傳統的方法是採用線性濾波運算元,現在廣泛採用非線性濾波運算元,例如加權中值和雙邊濾波器,各向異性擴散和非局部均值,以及變分方法。

          度量圖像去噪演算法效果時,一般採用峰值信噪比(PNSR),結構相似性(SSIM)索引。

        迄今為止所研究的圖像變換輸出圖像大小均等於輸入圖像的大小,為了對不同解析度的圖像進行處理,比如,對小圖像進行插值使其與電腦的解析度相匹配,或者減小圖像的大小來加速演算法的執行或節省存儲空間和傳輸時間。

        由於不知道處理圖像所需的解析度,故由多幅不同的圖像構建圖像金字塔,從而進行多尺度的識別和編輯操作。改變圖像解析度較好的濾波器是插值濾波器和降采樣濾波器。

      5.1 插值

        為將圖像變大到較高解析度,需要用插值核來卷積圖像,二次插值常用方法是雙線性插值,雙三次插值,窗函數。窗函數被認為是品質最高的插值器,因為它既可以保留低解析度圖像中的細節,又可以避免混疊。

        5.2 降采樣

        降采樣是為了降低圖像解析度,先用低通濾波器卷積圖像,避免混疊,再保持第r個樣例。常用的降采樣濾波器有線性濾波器,二次濾波器,三次濾波器,窗餘弦濾波器,QMF-9濾波器,JPEG2000濾波器。

        5.3 多解析度表示

        通過降采樣和插值演算法,能夠對圖像建立完整的圖像金字塔,金字塔可以加速由粗到精的搜索演算法,以便在不同的尺度上尋找物體和模式,或進行多解析度融合操作。

        計算機視覺中最有名的金字塔是拉普拉斯金字塔,採用大小為2因子對原圖像進行模糊和二次采樣,並將它存儲在金字塔的下一級。

      5.4 小波變換

        小波是在空間域和頻率域都定位一個信號的濾波器,並且是在不同層次的尺度上定義的。小波可以進行多尺度有向濾波和去噪。與常規的金字塔相比,小波具有更好的方向選擇性,並提供了緊致框架。

        提升小波被稱為第二代小波,很容易適應非常規采樣拓撲,還有導向可移位多尺度變換,它們的表述不僅是過完備的,而且是方向選擇的。

      5.5 應用:圖像融合

        拉普拉斯金字塔的應用,混合合成圖像。要產生混合圖像,每個原圖像先分解成它自己的拉普拉斯金字塔,之後每個帶被乘以一個大小正比於金字塔級別的平滑加權函數 。最簡單的方法是建立一個二值掩膜圖像,根據此圖像產生一個高斯金字塔,再將拉普拉斯金字塔和高斯掩膜,這兩個帶權金字塔的和產生最終圖像。

        相對於點操作改變了圖像的值域范圍,幾何變換關注於改變圖像的定義域。原先採用的方法是全局參數化2D變換,之後的注意力將轉向基於網格的局部變形等更多通用變形。

        6.1 參數變換

        參數化變換對整幅圖像進行全局變換,其中變換的行為由少量的參數控制,反向卷繞或反向映射的性能優於前向卷繞,主要在於其能夠避免空洞和非整數位置重采樣的問題。而且可以用高質量的濾波器來控制混疊。

        圖像卷繞問題可形式化為給定一個從目標像素x'到原像素x的映射來重采樣一副原圖像。類似的反向法應用場合有光流法預測光流以及矯正透鏡的徑向畸變。

        重采樣過程的插值濾波器有,二次插值,三次插值,窗插值,二次插值追求速度,三次插值和窗插值追求視覺品質。

        MIP映射是一種紋理映射的快速預濾波圖像工具。   

        MIP圖是標準的圖像金字塔,每層用一個高質量的濾波器濾波而不是低質量的近似,重采樣時,需要預估重采樣率r。

        橢圓帶權平均濾波器(EWA),各向異性濾波,多通變換。

        有向二位濾波和重采樣操作可以用一系列一維重采樣和剪切變換來近似,使用一系列一維變換的優點是它們比大的,不可分離的二位濾波核更有效。

        6.2 基於網格扭曲

            為了獲得更自由的局部變形,產生了網格卷繞。稀疏控制點,稠密集,有向直線分割,位移場的確定。

        6.3 應用:基於特徵的形態學

            卷繞常用於改變單幅圖像的外觀以形成動畫,也可用於多幅圖像的融合以產生強大的變形效果,在兩幅圖像之間進行簡單的漸隱漸顯會導致鬼影,但採用圖像卷繞建立了良好的對應關系,相應的特徵便會對齊。

        用一些優化准則明確表達想要變換的目標,再找到或推斷出這個准則的解決辦法。正則化和變分法,構建一個描述解特性的連續全局能量函數,然後用稀疏線性系統或相關迭代方法找到最小能量解,貝葉斯統計學對產生輸入圖像的有雜訊的測量過程和關於解空間的先驗假設進行建模,通常用馬爾科夫隨機場進行編碼。常見示例有散列數據的表面插值,圖像去噪和缺失區域恢復,將圖像分為前景和背景區域。

      7.1 正則化

        正則化理論試圖用模型來擬合嚴重欠約束解空間的數據。即用一個平滑的表面穿過或是靠近一個測量數據點集合的問題。這樣的問題是病態的和不適定的。這樣由采樣數據點d(xi,yi)恢復完整圖像f(x,y)的問題被稱為逆問題。

        為了定義平滑解,常在解空間上定義一個范數,對於一維函數,函數一階導數的平方進行積分,或對函數二階導數的平方進行積分,這種能量度量是泛函的樣例,是將函數映射到標量值的運算元,這種方法被稱為變分法,用於度量函數的變化(非平滑性)。

        7.2 馬爾科夫隨機場

        7.3 應用:圖像復原

9. CV演算法:金字塔(Image Pyramid)

參考資料:
Image Pyramid
斯坦福CS131-1718作業7
CS486-Lecture 11:LoG and DoG Filters

圖像通常在空間域上來進行表示,在空間域上我們可以進行很多濾波操作,濾波一般是操作點及其附近的信息。但是圖片包含很多復雜的信息,通常很難在空間域上就處理好。

我們還可以在頻域上對圖像進行操作。但頻域主要的問題會混合從圖片其他地方的頻率信息,這叫做「局部性的損失」(loss of locality),大部分情況下,我們不想在我們面部細節上混淆一些背景中草的信息。

為了利用空間域和頻域的信息,我們發明了空頻域(spatial-frequency),可以既分離頻率成分,又可以保留局部信息。

圖像金字塔實際上將圖片表示為一系列不同頻率的圖像,這些圖像保留了不同的細節信息,因為這個特性,又叫多解析度或者多尺度。

上一步的金字塔相減得到,注意右邊黑黑的才是。因為G1是要比G0小的,所以G0要擴大後再相減。L0實際上就是被濾掉的高頻信息,現在回來啦。L0更細節,更高頻。

金字塔就是另外一種表示圖片的方式,結合了空間域和頻域的優點。

岡薩雷斯書上說,在模式是被中,高解析度的圖像用來識別一些細節,低解析度的圖像用來識別一些大的結構。
在HOG識別人臉中,人臉因為大小不同可能跟計算出來錯誤,所以這里縮放多張圖片,依次計算,得到分數最大的才是。

10. 特徵金字塔網路FPN

姓名:郄心怡    學號:19020100205    學院:電子工程學院

【原文鏈接】 https://zhuanlan.hu.com/p/39185919

【嵌牛導讀】本文對特徵金字塔網路FPN做了一個簡單介紹

【嵌牛鼻子】特徵金字塔網路FPN

【嵌牛提問】什麼是特徵金字塔網路FPN?

【嵌牛正文】

這里介紹的文章是來自Facebook的特徵金字塔網路Feature Pyramid Networks(FPN)。FPN主要解決的是物體檢測中的多尺度問題,通過簡單的網路連接改變,在基本不增加原有模型計算量情況下,大幅度提升了小物體檢測的性能。我們將從論文背景,論文思想,結果與結論幾方面探討此論文。

在物體檢測裡面,有限計算量情況下,網路的深度(對應到感受野)與stride通常是一對矛盾的東西,常用的網路結構對應的stride一般會比較大(如32),而圖像中的小物體甚至會小於stride的大小,造成的結果就是小物體的檢測性能急劇下降。傳統解決這個問題的思路包括:

(1)多尺度訓練和測試,又稱圖像金字塔,如圖1(a)所示。目前幾乎所有在ImageNet和COCO檢測任務上取得好成績的方法都使用了圖像金字塔方法。然而這樣的方法由於很高的時間及計算量消耗,難以在實際中應用。

(2)特徵分層,即每層分別預測對應的scale解析度的檢測結果。如圖1(c)所示。SSD檢測框架採用了類似的思想。這樣的方法問題在於直接強行讓不同層學習同樣的語義信息。而對於卷積神經網路而言,不同深度對應著不同層次的語義特徵,淺層網路解析度高,學的更多是細節特徵,深層網路解析度低,學的更多是語義特徵。

因而,目前多尺度的物體檢測主要面臨的挑戰為:

1. 如何學習具有強語義信息的多尺度特徵表示?

2. 如何設計通用的特徵表示來解決物體檢測中的多個子問題?如object proposal, box localization, instance segmentation.

3. 如何高效計算多尺度的特徵表示?

本文針對這些問題,提出了特徵金字塔網路FPN,如圖1(d)所示,網路直接在原來的單網路上做修改,每個解析度的feature map引入後一解析度縮放兩倍的feature map做element-wise相加的操作。通過這樣的連接,每一層預測所用的feature map都融合了不同解析度、不同語義強度的特徵,融合的不同解析度的feature map分別做對應解析度大小的物體檢測。這樣保證了每一層都有合適的解析度以及強語義特徵。同時,由於此方法只是在原網路基礎上加上了額外的跨層連接,在實際應用中幾乎不增加額外的時間和計算量。作者接下來實驗了將FPN應用在Faster RCNN上的性能,在COCO上達到了state-of-the-art的單模型精度。

具體而言,FPN分別在RPN和Fast RCNN兩步中起到作用。其中RPN和Fast RCNN分別關注的是召回率和正檢率,在這里對比的指標分別為Average Recall(AR)和Average Precision(AP)。分別對比了不同尺度物體檢測情況,小中大物體分別用s,m,l表示。

在RPN中,區別於原論文直接在最後的feature map上設置不同尺度和比例的anchor,本文的尺度信息對應於相應的feature map(分別設置面積為32^2, 64^2, 128^2, 256^2, 512^2),比例用類似於原來的方式設置{1:2, 1:1,, 2:1}三種。

與RPN一樣,FPN每層feature map加入3*3的卷積及兩個相鄰的1*1卷積分別做分類和回歸的預測。在RPN中,實驗對比了FPN不同層feature map卷積參數共享與否,發現共享仍然能達到很好性能,說明特徵金字塔使得不同層學到了相同層次的語義特徵。RPN網路的實驗結果為:

這里FPN對比原來取自conv4和conv5的RPN網路(a)(b),召回率得到了大幅度提升,尤其在中物體和小物體上(c)。另外,作者做了變數對比實驗,比如只保留橫向連接(d),即特徵分層網路,性能僅與原RPN差不多,原因就在於不同層之間的語義特徵差距較大。另外,試驗了砍掉橫向連接,只保留自上而下放大feature map做預測結果(e),以及只用最終得到的feature map層(f),均比完整的FPN網路小物體檢測AR低10個點左右。說明金字塔特徵表示與橫向連接都起了很大作用。

實驗Fast RCNN時,需要固定FPN+RPN提取的proposal結果。在Fast RCNN里,FPN主要應用於選擇提取哪一層的feature map來做ROI pooling。假設特徵金字塔結果對應到圖像金字塔結果。定義不同feature map集合為{P2, P3, P4, P5},對於輸入網路的原圖上w*h的ROI,選擇的feature map為Pk,其中(224為ImageNet輸入圖像大小):

類似於RPN的實驗,對比了原有網路,以及不同改變FPN結構的Fast RCNN實驗,實驗結果為:

實驗發現FPN篩選ROI區域,同樣對於Fast RCNN的小物體檢測精度有大幅提升。同時,FPN的每一步都必不可少。

最後,FPN對比整個Faster RCNN的實驗結果如下:

對比其他單模型方法結果為:

最後是在FPN基礎上,將RPN和Fast RCNN的特徵共享,與原Faster CNN一樣,精度得到了小幅提升。

FPN+Faster RCNN的方法在COCO數據集上最終達到了最高的單模型精度。

總結起來,本文提出了一種巧妙的特徵金字塔連接方法,實驗驗證對於物體檢測非常有效,極大提高了小物體檢測性能,同時由於相比於原來的圖像金字塔多尺度檢測演算法速度也得到了很大提升。

Q1:不同深度的feature map為什麼可以經過upsample後直接相加?

答:作者解釋說這個原因在於我們做了end-to-end的training,因為不同層的參數不是固定的,不同層同時給監督做end-to-end training,所以相加訓練出來的東西能夠更有效地融合淺層和深層的信息。

Q2:為什麼FPN相比去掉深層特徵upsample(bottom-up pyramid)對於小物體檢測提升明顯?(RPN步驟AR從30.5到44.9,Fast RCNN步驟AP從24.9到33.9)

答:作者在poster里給出了這個問題的答案

對於小物體,一方面我們需要高解析度的feature map更多關注小區域信息,另一方面,如圖中的挎包一樣,需要更全局的信息更准確判斷挎包的存在及位置。

Q3:如果不考慮時間情況下,image pyramid是否可能會比feature pyramid的性能更高?

答:作者覺得經過精細調整訓練是可能的,但是image pyramid主要的問題在於時間和空間佔用太大,而feature pyramid可以在幾乎不增加額外計算量情況下解決多尺度檢測問題。

閱讀全文

與圖像金字塔演算法相關的資料

熱點內容
php微信圖片防盜鏈 瀏覽:795
安卓1怎麼讀音 瀏覽:286
農業app怎麼開通快捷支付 瀏覽:908
pythonredisdict 瀏覽:382
如何攻擊別人網賭伺服器 瀏覽:878
隱私與應用加密的圖案密碼 瀏覽:34
陳情令王一博解壓 瀏覽:35
c編譯器使用說明 瀏覽:703
鄭州前端程序員私活有風險嗎 瀏覽:10
小型螺桿機壓縮機 瀏覽:516
成人解壓最好的方法 瀏覽:48
最小製冷壓縮機 瀏覽:490
xampp支持python 瀏覽:367
深圳周立功單片機 瀏覽:61
圓上點與點之間角度演算法 瀏覽:869
怎麼知道微信關聯了哪些app 瀏覽:702
android事件驅動 瀏覽:888
簽約大屏系統源碼 瀏覽:808
安卓系統怎麼轉入平板 瀏覽:429
安卓手機相機怎麼提取文字 瀏覽:219