【原文:http://www.cppblog.com/polly-yang/archive/2012/07/14/183327.aspx】
一.房屋检测小结
一开始,直接用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实现代码
1
![](https://i-blog.csdnimg.cn/blog_migrate/cbef093dcc044b2793832001e2365e43.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/cbef093dcc044b2793832001e2365e43.gif)
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
else
27
{
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![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
35
create_kernel();
36
}
37
}
38
39
void CGaborFilter::Init(
float dSigma,
float dTheta,
float dPhi)
40
{
41
float dtmp;
42
int itmp;
43![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
44
sigma = dSigma;
45
Theta = dTheta;
46
Phi = dPhi;
47
Gamma = GAMMA;
48
Lambda = sigma/RATIO_S2L;
49
bParam = 1;
50![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
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![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
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![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
66
Lambda = dLambda;
67
Theta = dTheta;
68
Phi = dPhi;
69
Gamma = dGamma;
70
sigma = Lambda * RATIO_S2L;
71
bParam = 1;
72![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
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![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
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![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
88
if(is_init() == 0)
89
printf("The parameters haven't been initialed!");
90![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
91![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
92
else{
93![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
94![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
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![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
102![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
103
xtmp = (float)x*cos(Theta) - (float)y*sin(Theta);
104
ytmp = (float)x*sin(Theta) + (float)y*cos(Theta);
105![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
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![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
112
}
113
bKernel = 1;
114
}
115
}
116
117
![](https://i-blog.csdnimg.cn/blog_migrate/cbef093dcc044b2793832001e2365e43.gif)
IplImage * CGaborFilter::get_Image()
118
{
119
if(is_kernel() == 0)
120
{
121
printf("The filter hasn't bee created!");
122
}
123
else
124
{
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![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/cbef093dcc044b2793832001e2365e43.gif)
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![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
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![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
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![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
162
cvFilter2D(tmpGrayImg,pDestImage,pGaborKernel,cvPoint((GaborWindow.width-1)/2,(GaborWindow.height-1)/2));
163![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
164
cvReleaseImage(&tmpImg);
165
return pDestImage;
166
}
167
}