码迷,mamicode.com
首页 > 其他好文 > 详细

实现gabor filter的滤波

时间:2015-03-14 12:19:15      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

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




实现gabor filter的滤波

标签:

原文地址:http://www.cnblogs.com/jsxyhelu/p/4337171.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!