zoukankan      html  css  js  c++  java
  • 实现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;
    //}





  • 相关阅读:
    认证与授权(访问控制)
    文件上传漏洞
    注入攻击
    HTML 5 安全
    Linux添加开机启动命令
    mysql开启远程访问权限
    mysql_connect() php7不支持,php5.5可以,是废弃函数
    REGEXP 正则的实现两个字符串组的匹配。(regexp)
    文章排序权重
    Redis 基本操作
  • 原文地址:https://www.cnblogs.com/jsxyhelu/p/4337171.html
Copyright © 2011-2022 走看看