轉載請注明:http://m.shnenglu.com/polly-yang/
一.房屋檢測小結
一開始,直接用LSD(Line Segment Detector)檢測VHR(Very High Resolution)遙感衛星圖像中的房屋,效果很屎。效果很屎的主要原因是因為存在各種干擾,概括下來,主要有:
1. 道路。道路干擾性強主要是因為道路呈現各種形態,彎曲,筆直,寬度不一。同時還有橋梁也影響檢測率,橋梁附近呈現較好的陰影效果和Line Segment,會干擾幾何檢測方法。
2.森林或農田。利用LSD檢測Line Segment的時候,由于LSD原理限制,在森林或農田區域,會形成較多的Line Segment,影響幾何檢測方法。
3.房屋本身。實際VHR遙感圖像中,房屋形態較多,大小差異較大,且有的呈現不規則的形狀,有的成像后,邊緣模糊,不利于產生較好的LSD結果。
4.遮擋。主要是被森林遮擋,屋頂形狀不完整,不利于設計算法判別。
6.光照不均,屋頂自身紋理。光照不均和屋頂自己紋理不均勻,都會加大VHR中物體的檢測難度。
二.Gabor 濾波器簡介(部分資料來自維基百科)
在圖像處理領域,Gabor濾波器是一個用于邊緣檢測的線性濾波器。Gabor濾波器的頻率和方向表示接近人類視覺系統對于頻率和方向的表示,并且它們常備用于紋理表示和描述。在空域,一個2維的Gabor濾波器是一個正弦平面波和高斯核函數的乘積。Gabor濾波器是自相似的,也就是說,所有Gabor濾波器都可以從一個母小波經過膨脹和旋轉產生。實際應用中,Gabor濾波器可以在頻域的不同尺度,不同方向上提取相關特征。
三.Gabor濾波器公式化定義

公式中:
λ:正弦函數波長;
θ:Gabor核函數的方向
ψ:相位偏移
σ:高斯函數的標準差
γ: 空間的寬高比(這個沒太理解)
四.Gabor 濾波器opencv實現代碼
CGaborFilter::CGaborFilter(float dLambda, float dTheta, float dRatio_S2L, float dGamma, float dPhi)2
{3
Lambda = dLambda;4
Theta = dTheta;5
sigma = dLambda*dRatio_S2L;6
Gamma = dGamma;7
Phi = dPhi;8
m_pGaborFilter = NULL;9
bParam = 1;10
}11

12

13
CGaborFilter::~CGaborFilter(void)14
{15
cvReleaseMat(&m_pGaborFilter);16
}17

18
void CGaborFilter::Init()19
{20
float dtmp;21
int itmp;22
if(is_param() == 0)23
{24
printf("The parameters are not enough!");25
}26
else27
{28
dtmp = sqrt(48*pow(sigma,2)+1);29
itmp = cvRound(dtmp);30
if(itmp%2 == 0)31
itmp ++;32
GaborWindow.height = GaborWindow.width = 16;33
bInit = 1;34

35
create_kernel();36
}37
}38

39
void CGaborFilter::Init(float dSigma,float dTheta,float dPhi)40
{41
float dtmp;42
int itmp;43

44
sigma = dSigma;45
Theta = dTheta;46
Phi = dPhi;47
Gamma = GAMMA;48
Lambda = sigma/RATIO_S2L;49
bParam = 1;50

51
dtmp = sqrt(24*pow(sigma,2));52
itmp = cvRound(dtmp);53
if(itmp%2 == 0)54
itmp ++;55
GaborWindow.height = GaborWindow.width = itmp;56
bInit = 1; 57

58
create_kernel();59
}60

61
void CGaborFilter::Init(float dLambda,float dTheta, float dPhi,float dGamma)62
{63
float dtmp;64
int itmp;65

66
Lambda = dLambda;67
Theta = dTheta;68
Phi = dPhi;69
Gamma = dGamma;70
sigma = Lambda * RATIO_S2L;71
bParam = 1;72

73
dtmp = sqrt(24*pow(sigma,2));74
itmp = cvRound(dtmp);75
if(itmp%2 == 0)76
itmp ++;77
GaborWindow.height = GaborWindow.width = itmp;78
bInit = 1; 79

80
create_kernel();81
}82

83
void CGaborFilter::create_kernel()84
{85
float tmp1,tmp2,xtmp,ytmp,re;86
int i,j,x,y;87

88
if(is_init() == 0)89
printf("The parameters haven't been initialed!");90

91

92
else{93

94

95
m_pGaborFilter = cvCreateMat(GaborWindow.height,GaborWindow.width,CV_32FC1);96
for(i= 0; i< GaborWindow.height; i++)97
for(j = 0; j< GaborWindow.width; j++)98
{99
x = j - GaborWindow.width/2;100
y = i - GaborWindow.height/2;101

102

103
xtmp = (float)x*cos(Theta) - (float)y*sin(Theta);104
ytmp = (float)x*sin(Theta) + (float)y*cos(Theta);105

106
tmp1 = exp(-(pow(xtmp,2)+pow(ytmp*Gamma,2))/(2*pow(sigma,2)));107
tmp2 = cos(2*PI*xtmp/Lambda + Phi);108
// int p=sizeof(float);109
re = tmp1*tmp2;110
cvSetReal2D((CvMat*)m_pGaborFilter,i,j,re);111

112
}113
bKernel = 1;114
}115
}116

117
IplImage * CGaborFilter::get_Image()118
{119
if(is_kernel() == 0)120
{121
printf("The filter hasn't bee created!");122
}123
else124
{125
IplImage *pImg = cvCreateImage(GaborWindow,IPL_DEPTH_32F,1);126
IplImage *pImgU8 = cvCreateImage(GaborWindow,IPL_DEPTH_8U,1);127
CvMat * pMat = cvCreateMat(GaborWindow.height,GaborWindow.width,CV_32FC1);128

129
cvCopy(m_pGaborFilter,pImg);130
//pImg->imageData = (char *)pMat->data;131
cvNormalize((IplImage*)pImg, (IplImage*)pImg,0,255,CV_MINMAX,NULL);132
cvConvertScaleAbs(pImg,pImgU8,1,0);133
return pImgU8;134
}135
}136

137
IplImage * CGaborFilter::do_filter(const IplImage * src)138
{139
if(is_kernel()==false)140
{141
printf("The Gabor Kernel has not been created!");142
}143
else{144

145
IplImage *pDestImage = cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);146
// IplImage * pGaborImage = get_Imge();147
// CvMat GaborKernel = cvMat(pGaborImage->height,pGaborImage->width,CV_8U,pGaborImage->imageData);148
IplImage *tmpImg = cvCloneImage(src);149
IplImage *tmpGrayImg = cvCreateImage(cvSize(src->width,src->height),IPL_DEPTH_8U,1);150

151
if(tmpImg->nChannels != 1)152
{153
cvCvtColor(tmpImg,tmpGrayImg,CV_BGR2GRAY);154
}155
else 156
{157
cvReleaseImage(&tmpGrayImg);158
tmpGrayImg = tmpImg;159
}160
CvMat * pGaborKernel = get_Mat();161

162
cvFilter2D(tmpGrayImg,pDestImage,pGaborKernel,cvPoint((GaborWindow.width-1)/2,(GaborWindow.height-1)/2));163

164
cvReleaseImage(&tmpImg);165
return pDestImage; 166
}167
}



