【图像处理】Gabor滤波器

Gabor的核函数参考的wiki


使用实数Real的公式计算核函数代码:

Mat getGaborFilter(float lambda, float theta, 
	float sigma2,float gamma, 
	float psi = 0.0f){
		if(abs(lambda-0.0f)<1e-6){
			lambda = 1.0f;
		} 
		float sigma_x = sigma2;
		float sigma_y = sigma2/(gamma*gamma);
		int nstds = 3;
		float sqrt_sigma_x = sqrt(sigma_x);
		float sqrt_sigma_y = sqrt(sigma_y);
		int xmax = max(abs(nstds*sqrt_sigma_x*cos(theta)),abs(nstds*sqrt_sigma_y*sin(theta)));
		int ymax = max(abs(nstds*sqrt_sigma_x*sin(theta)),abs(nstds*sqrt_sigma_y*cos(theta)));
		int half_filter_size = xmax>ymax ? xmax:ymax;
		int filter_size = 2*half_filter_size+1;
		Mat gaber = Mat::zeros(filter_size,filter_size,CV_32F);
		for(int i=0;i(i);
			for(int j=0;j

使用得到的Gabor核对一副图像进行卷积的函数:

Mat gaborFilter(Mat& img, Mat& filter){
	int half_filter_size = (max(filter.rows,filter.cols)-1)/2;
	Mat filtered_img(img.rows,img.cols,CV_32F);
	for(int i=0;i(i);
		float* img_f = filtered_img.ptr(i);
		for(int j=0;j(fi);
				int img_i = i+fi-half_filter_size;
				img_i = img_i < 0 ? 0 : img_i;
				img_i = img_i >= img.rows ? (img.rows-1) : img_i;
				uchar* p = img.ptr(img_i);
				for(int fj=0;fj= img.cols) ? (img.cols-1) : img_j;
					float tmp = (float)p[img_j]*f[fj];
					filter_value += tmp;
				}
			}
			img_f[j] = filter_value;
		}
	}
	return filtered_img;
}

对一幅图使用如下核卷积:

Mat gaber = getGaborFilter(0.3,0,4,2);
效果如下:


Gabor算子卷积之后得到很多负值(不知道有没有问题),后面的图是归一化之后显示出来的。

Mat normalizeFilterShow(Mat gaber){
	Mat gaber_show = Mat::zeros(gaber.rows,gaber.cols,CV_8UC1);
	float gaber_max = FLT_MIN;
	float gaber_min = FLT_MAX;
	for(int i=0;i(i);
		for(int j=0;jgaber_max){
				gaber_max = f[j];
			}
			if(f[j](i);
		float* f = gaber.ptr(i);
		for(int j=0;j

(转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu 未经允许请勿用于商业用途)



你可能感兴趣的:(【机器视觉】,【图像处理】)