实现gabor filter的滤波
实现gabor filter的滤波
图像纹理对于航空遥感图片、织物图案、复杂自然风景和动植物都适合。这里我采用遥感图片、织物图案和钢铁表面来做,并和canny图片进行一定的对比。
遥感图像
编织物
相比较canny算法(或者自适应canny)来说,gabor的确在全局的特征显示上面有所优势,特别是在明暗变化的地方显示较好。
下一步如何在图像识别拼接、图像分类处使用,需要继续研究学习。
附代码,根据开源代码做修改,欢迎指出问题和不足,来源于 opencv-gabor-filter-master 。
//gaborFilterHelper 根据opencv-gabor-filter-master 修改 #include "stdafx.h" #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include <math.h> //定义初始系数 //创建gabor核 cv::Mat mkKernel( int ks, double sig, double th, double lm, double ps) { int hks = (ks-1)/2; double theta = th*CV_PI/180; double psi = ps*CV_PI/180; double del = 2.0/(ks-1); double lmbd = lm; double sigma = sig/ks; double x_theta; double y_theta; cv::Mat kernel(ks,ks, CV_32F); for ( int y=-hks; y<=hks; y++) { for ( int x=-hks; x<=hks; x++) { x_theta = x*del*cos(theta)+y*del*sin(theta); y_theta = -x*del*sin(theta)+y*del*cos(theta); kernel.at< float >(hks+y,hks+x) = ( float )exp(-0.5*(pow(x_theta,2)+pow(y_theta,2))/pow(sigma,2))* cos(2*CV_PI*x_theta/lmbd + psi); } } return kernel; } //得到gabor图像,在我看来gabor算是一种纹理强化,类似于canny Mat GetGabor(Mat src, double sig, double lm, double th, double ps, int kernel_size) { Mat dest; Mat src_f; if (!kernel_size%2) { kernel_size+=1; } src.convertTo(src_f, CV_32F, 1.0/255, 0); //创建卷积核 cv::Mat kernel = mkKernel(kernel_size, sig, th, lm, ps); //卷积 cv::filter2D(src_f, dest, CV_32F, kernel); cv::Mat Lkernel(kernel_size*20, kernel_size*20, CV_32F); cv::resize(Lkernel, Lkernel, Lkernel.size()); Lkernel /= 2.; Lkernel += 0.5; cv::Mat mag; cv::pow(dest, 2.0, mag); return mag; } //int main(int argc, char** argv) //{ // cv::Mat image = cv::imread("数据集/训练图片/1.jpg",1); // cv::imshow("Src", image); // cv::Mat src; // cv::cvtColor(image, src, CV_BGR2GRAY); // src.convertTo(src_f, CV_32F, 1.0/255, 0); // if (!kernel_size%2) // { // kernel_size+=1; // } // cv::namedWindow("Process window", 1); // cv::createTrackbar("Sigma", "Process window", &pos_sigma, kernel_size, Process); // cv::createTrackbar("Lambda", "Process window", &pos_lm, 100, Process); // cv::createTrackbar("Theta", "Process window", &pos_th, 180, Process); // cv::createTrackbar("Psi", "Process window", &pos_psi, 360, Process); // Process(0,0); // cv::waitKey(0); // return 0; //}