实现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;
//}

 


 

 

posted on 2022-12-03 15:32  jsxyhelu  阅读(196)  评论(0编辑  收藏  举报

导航