Gabor滤波器与特征提取

2023-11-09

一、Gabor滤波器
Gabor滤波器,最主要使用优势体现在对物体纹理特征的提取上

二维Gabor基函数能够很好地描述哺乳动物初级视觉系统中一对简单视觉神经元的感受野特性。随着小波变换和神经生理学的发展,Gabor变换逐渐演变成二维Gabor小波的形式。Gabor滤波器对于图像的亮度和对比度变化以及人脸姿态变化具有较强的健壮性,并且它表达的是对人脸识别最为有用的局部特征,故在计算机视觉及纹理分析中得到广泛的应用。

如果从Fourier变换的角度来看,Gobor变换就是窗函数取高斯窗时的短时Fourier变换
如果从小波变换的角度来看,Gabor变换就是小波基函数取Gabor基小波变换

f(x,y)=12πσxσy1ρ2e12(1ρ2)[(xaσx)2+(ybσy)2(2ρ(xa)(yb)σxσy)]

a,b,σ1,σ2,ρ(X,Y)a,b,σ1,σ2,ρN(a,b,σ1,σ2,ρ)
a,b,σ1,σ2,ρσ1>0,σ2>0,<a<+,<b<+,1<ρ<1
Oxya,b

a=b=0,ρ=0
f(x,y)=12πσxσye12[(xσx)2+(yσy)2]

Gabor小波实质上是由一个复指数信号调制一个二维高斯函数得到。

g(x,y)=12πσxσye12[(xσx)2+(yσy)2]ei2π(μ0x+ν0y)

[xy]=[cosθsinθsinθcosθ][xy]

θGabor
σx,σy

二、Gabor函数结合代码分析:
g(x,y;λθϕσ,γ)=e12[(xσ)2+(γyσ)2]ei(2πxλ+ϕ)
实数:
g(x,y;λθϕσ,γ)=e12[(xσ)2+(γyσ)2]cos(2πxλ+ϕ)
虚数:
g(x,y;λθϕσ,γ)=e12[(xσ)2+(γyσ)2]sin(2πxλ+ϕ)

波长 λ :它的值以像素为单位指定,通常大于等于2.但不能大于输入图像尺寸的五分之一。
方向 θ :这个参数指定了Gabor函数并行条纹的方向,它的取值为0到 2π
相位偏移 ϕ :它的取值范围为 ππ 。其中,0、 π 度分别对应中心对称的center-on函数和center-off函数,而- π/2 π/2 对应反对称函数。
长宽比 γ :空间纵横比,决定了Gabor函数形状的椭圆率 ellipticity
γ=1 时,形状是圆的。当 γ<1 时,形状随着平行条纹方向而拉长。通常该值为0.5。
带宽 b Gabor 滤波器的半响应空间频率带宽b和σ/ λ的比率有关,其中 σ 表示Gabor函数的高斯因子的标准差,如下:
g(x,y;λθϕσ,γ)=e12[(xσ)2+(γyσ)2]sin(2πxλ+ϕ)

b=log2σπλ+ln22σπλln22

σλ=1πln222b+12b1

σ 的值不能直接设置,它仅随着带宽b变化。带宽值必须是正实数,通常为1,此时,标准差和波长的关系为: σ=0.56λ
带宽越小,标准差越大, Gabor 形状越大,可见平行和抑制区条纹数量越多

    //构造Gabor函数
    for (int k = 0;k < N;k++)                   //定义N方向
    {
        Theta = PI*((double)k/N);      //0*PI/4,1*PI/4,2*PI/4,3*PI/4
        for (int i = 0;i < gabor_height;i++)    //定义模版大小
        {
            for (int j = 0;j < gabor_width;j++)
            {
                x = j - gabor_width/2; //-5,-4,-3,-2,-1,0,+1,+2,+3,+4
                y = i - gabor_height/2;//-5,-4,-3,-2,-1,0,+1,+2,+3,+4

                xtmp = (double)x*cos(Theta) + (double)y*sin(Theta);
                ytmp = (double)y*cos(Theta) - (double)x*sin(Theta);

                tmp1 = /*(1/(2*PI*sigma_x*sigma_y))**/exp(-(pow(xtmp,2)/pow(sigma_x,2)+pow(ytmp,2)/pow(sigma_y,2))/2);
                tmp2 = cos(2*PI*xtmp/Lambda);
                tmp3 = sin(2*PI*xtmp/Lambda);

                re = tmp1*tmp2;
                im = tmp1*tmp3;

                rel[i*gabor_width+j] = re;
                img[i*gabor_width+j] = im;
                //printf("%f,%f\n",re,im);
            }
        }
        //用不同方向的Gabor函数对图像滤波并保存图片 
        g_filer(src_data,src->height,src->width,rel,img,10,10,k);
    }

参考资料:
基于测地线活动区域模型的非监督式纹理分割
何 源, 罗予频, 胡东成
这里写图片描述

这里写图片描述

三、参考书籍资料研究:
《人脸识别与人体动作识别技术与应用》 曹林著
这里写图片描述

这里写图片描述

这里写图片描述

四、参考网上代码:

// gabor.cpp : 定义控制台应用程序的入口点。

//#include "stdafx.h"
#include<iostream>
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
#include <opencv2/imgproc/imgproc.hpp>
#include "math.h"
#define  PI 3.1415926
#define  N 8
using namespace std;
using namespace cv;

void m_filer(double *src,int height,int width,double *mask_rel,double *mask_img,int mW,int mH,int k)
{
    IplImage *tmp;
    double a,b,c;
    char res[20];       //保存的图像名称

    tmp = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);

    for (int i = 0;i < height;i++)
    {
        for (int j = 0;j < width;j++)
        {
            a = 0.0;
            b = 0.0;
            c = 0.0;
            //去掉靠近边界的行列,无法滤波,超出范围 卷积
            if (i > int(mH/2) && i < height - int(mH/2) && j > int(mW) && j < width - int(mW/2))
            {
                for (int m = 0;m < mH;m++)
                {
                    for(int n = 0;n < mW;n++)
                    {
                        //printf("%f\n",src[(i+m-int(mH/2))*width+(j+n-int(mW))]);
                        a += src[(i+m-int(mH/2))*width+(j+n-int(mW))]*mask_rel[m*mW+n];
                        b += src[(i+m-int(mH/2))*width+(j+n-int(mW))]*mask_img[m*mW+n];
                        //printf("%f,%f\n",a,b);
                    }
                }
            }
            c = sqrt(a*a+b*b);
            c /= mW*mH;
            tmp->imageData[i*width+j] = (unsigned char)c;
        }
    }
    sprintf(res,"result%d.jpg",k);
    cvSaveImage(res,tmp);
    cvReleaseImage(&tmp);
}

int main(int argc, char* argv[])
{
    IplImage *src;
    double *rel,*img,*src_data,xtmp,ytmp,tmp1,tmp2,tmp3,re,im;
    double Theta,sigma,Gamma,Lambda,Phi;        //公式中的5个参数
    int gabor_height,gabor_width,x,y;

    src = cvLoadImage("1.jpg",CV_LOAD_IMAGE_GRAYSCALE);
    gabor_height = 10;
    gabor_width = 10;
    Gamma = 1.0;
    Lambda = 10.0;
    sigma = 100;
    Phi = 0;

    rel = (double *)malloc(sizeof(double)*gabor_width*gabor_height);//实数部分
    img = (double *)malloc(sizeof(double)*gabor_width*gabor_height);//虚数部分
    src_data = (double *)malloc(sizeof(double)*src->widthStep*src->height); //图像数据 

    for (int i=0;i<src->height;i++)
    {
        for (int j=0;j<src->widthStep;j++)
        {
            src_data[i*src->widthStep+j]=(unsigned char)src->imageData[i*src->widthStep+j];
            //printf("%f\n",src_data[i*src->widthStep+j]);
        }
    }

    //构造gabor函数
    for (int k = 0;k < N;k++)                   //定义N方向
    {
        Theta = PI*((double)k/N);      //0*PI/8,1*PI/8,2*PI/8,3*PI/8,4*PI/8,5*PI/8,6*PI/8,7*PI/8
        for (int i = 0;i < gabor_height;i++)    //定义模版大小
        {
            for (int j = 0;j < gabor_width;j++)
            {
                x = j - gabor_width/2; //-5,-4,-3,-2,-1,0,+1,+2,+3,+4
                y = i - gabor_height/2;//-5,-4,-3,-2,-1,0,+1,+2,+3,+4

                xtmp = (double)x*cos(Theta) + (double)y*sin(Theta);
                ytmp = (double)y*cos(Theta) - (double)x*sin(Theta);

                tmp1 = exp(-(pow(xtmp,2)+pow(ytmp*Gamma,2))/(2*pow(sigma,2)));
                tmp2 = cos(2*PI*xtmp/Lambda + Phi);
                tmp3 = sin(2*PI*xtmp/Lambda + Phi);

                re = tmp1*tmp2;
                im = tmp1*tmp3;

                rel[i*gabor_width+j] = re;
                img[i*gabor_width+j] = im;
                //printf("%f,%f\n",re,im);
            }
        }
        //用不同方向的GABOR函数对图像滤波并保存图片
        m_filer(src_data,src->height,src->width,rel,img,10,10,k);
    }

    free(rel);
    free(img);
    free(src_data);
    return 0;
}

这里写图片描述

Matlab研究分析Gabor滤波器
http://blog.csdn.net/forest_world/article/details/51018493

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gabor滤波器与特征提取 的相关文章

  • js压缩图片

    1 压缩方法 图片压缩方法 imageHandel imageCompress 若按照指定大小压缩则quality参数无效 按照图片大小压缩会存在误差 author luxuebo Date 2020 04 04 param file Fi
  • OpenStack--部署认证服务keystone

    官方安装文档 https docs openstack org ocata zh CN install guide rdo index html 1 keystone数据库配置 1 创建数据库 root linux host4 mysql
  • pytorch转onnx(支持动态batchsize、shape

    以fcos模型为例 需要输出fpn的5个feature map 需要支持多个尺寸输出 不同batchsize 1 转onnx模型 import argparse import os path as osp import warnings i
  • GPS设备获取的坐标转换成百度或者高德坐标

    JSON文件数据格式如上 用底下的转换工具类即可完成转换 直接上代码 import com fasterxml jackson databind ObjectMapper import com zc smartcity ZtfServerA
  • org.springframework.data.repository.query.QueryByExampleExecutor cannot be resolved.

    SpringBoot 集成JPA提示如下错误信息 The type org springframework data repository query QueryByExampleExecutor cannot be resolved It
  • 多团队协作开发的大型项目Git工作流设计分享

    一 项目简介 文章内容以我自己实际负责的项目前端代码的管理为例 每个公司的git工作流设计应以公司的实际为准 该分享仅做参考 1 项目架构设计 采用基于qiankun的前端微应用 基座应用 业务模块应用 架构设计 项目所管理的供应商达400
  • 一些在前后端用来进行储存数据的地方或者方式

    一些在前后端用来进行储存数据的地方或者方式 文件 可以通过生成新文件的方式将新数据进行储存 这里要考虑到对文件的读写 容量 操作繁琐等等 数据库 属于后端储存数据的地方 如果前端去拿数据的话需要发送HTTP请求 缓存 也叫cache mem
  • VUE tree树双击选中(显示层级结构) 及 vuedraggable插件拖拽功能的实现

    左侧双击选中到中间 显示层级结构 中间可拖拽到右侧 且不可重复拖拽 右侧上下可互相拖拽
  • JS 删除数组中某个元素的几种方式

    目录 第一种 删除最后一个元素 pop 删除 slice 删除 splice 删除 for 删除 length 删除 第二种 删除第一个元素 shift 删除 slice 删除 splice 删除 第三种 删除数组中某个指定下标的元素 sp
  • Opencascade之选择对象

    一 选择模式 Opencascade 通过鼠标选择对象 有多种选择模式 调用AIS InteractiveContext Activate方法进行设置 void SinnView SetSelectMode TopAbs ShapeEnum
  • Vue组件通信方式(8种)

    1 一图认清组件关系名词 父子关系 A与B A与C B与D C与E 兄弟关系 B与C 隔代关系 A与D A与E 非直系亲属 D与E 总结为三大类 父子组件之间通信 兄弟组件之间通信 跨级通信 2 8种通信方式及使用总结 props emit
  • Wireshark—网络分析工具

    Wireshark介绍 WireShark是非常流行的网络封包分析工具 可以截取各种网络数据包 并显示数据包详细信息 常用于开发测试过程中各种问题定位 WireShark软件安装 软件下载路径 wireshark官网 按照系统版本选择下载
  • 电子设计大赛应该准备什么

    电赛的准备 电子设计大赛应该准备什么 基 础 知 识 储 备 基本材料的准备 必 备 技 能 项 目 训 练 Wish 总结 电子设计大赛应该准备什么 2021年的电子设计大赛就要来了 小伙伴是否已经开始紧张的装备呢 下面进入正题 想参加比
  • 记录一次笔试题(R语言)

    记录一次笔试题 R语言 data lt read csv 银行 csv 1 取出李姓 法1 record xingshi c FALSE FALSE FALSE FALSE for i in 1 4 if substring data i
  • mybatis将时间存入数据库后,只有日期,时分秒全是0

    问题原因分析 a 数据库字段类型问题 mysql数据库中 date 为年月日 time为时分秒 datetime为年月日时分秒 pgsql数据库中 Date为年月日 timestamp为年月日时分秒 b mybatis中jdbcType c
  • 【数据分析】数据分析方法(四):多维度拆解分析 & 对比分析

    数据分析方法 四 多维度拆解分析 对比分析 1 多维度拆解分析方法 对于多维度拆解分析方法 要理解两个关键词 维度 拆解 只看数据整体 我们可能注意不到数据内部各个部分构成的差异 如果忽略这种差异进行比较 就有可能导致无法察觉该差异所造成的

随机推荐

  • 冒泡排序,快速排序详解及C++代码详细实现

    冒泡排序 冒泡排序的基本思想是 从后往前 或从前往后 两两比较相邻元素的值 若为逆序 即A i 1 gt A i 则交换它们 直到序列比较完 我们称它为第一趟冒泡 结果是将最小的元素交换到待排序列的第一个位置 或将最大的元素交换到待排序列的
  • CubeMX 5.5 修改HAL库库函数版本

    最初我是按照软件推荐 自动按安装的1 15的 为了和正点原子的例程统一库函数版本 就下载了1 11 但是在工程配置界面始终没有办法修改hal库版本的选择 关闭CubeMX 使用记事本打开工程文件 修改版本号 重新打开工程 库版本修改成功 工
  • Linux学习基础操作和文件管理命令

    Linux学习基础操作和文件管理命令 1 如何解决系统图形出现问题 1 ctrl alt f2 f6 gt gt gt 进入虚拟控制台 ctrl alt f1 gt gt gt 返回图形 2 登陆系统获得root权限 执行init 3 lo
  • 关于富文本编辑图片移动端太大溢出,太小正常处理

    在使用富文本编辑完文章 生成html字符串后 直接给移动端使用 如果图片太大 会出现溢出 图片太小没有问题 如果简单粗暴给全局样式img添加width 100 是可以解决溢出问题 但又造成了一个新的问题 就是小图片之前没有溢出也都变成了10
  • No Feign Client for loadBalancing defined. Didyou forget to include spring-cloud-starter-loadbalance

    Unexpected exception during bean creation nested exception is java lang IllegalStateException No Feign Client for loadBa
  • 解决idea不能搜索任何插件

    解决idea不能搜索任何插件 解决idea不能搜索任何插件
  • 持续集成/技术交付全流程流水线工具的设计与落地

    文章目录 持续集成 技术交付全流程流水线工具的设计与落地 概述 工具架构设计 主要功能模块 代码库 Jenkins 流水线 代码构建 自动化测试 产品部署 监控报警 使用方法 步骤一 安装 Jenkins 步骤二 创建 Jenkins 流水
  • 汇编语言(王爽第三版)实验十七

    实验十七 这道题我也不知道写的对不对 逻辑上应该没啥问题 但是运行起来好像没效果 题目和个人思路 安装一个新的int 7ch中断例程 实现通过逻辑扇区号对软盘进行读写 参数说明 1 用ah寄存器传递功能号 0表示读 1表示写 2 用dx寄存
  • vue中下载文件导出保存到本地

    vue中下载文件导出保存到本地 先分析如何下载 先有一个链接地址 然后使用 location href或window open 下载到本地 看看返回数据 res config url 中是下载链接地址 res data 中是返回的二进制数据
  • 结构体指针变量使用方法举例

    include
  • 报表设计

    最近在做任务报表方面的工作 之前一直以为查询和报表是一样东西 虽说 报表是查询的一种展示模式 但是做分析时 还是应该将以区别 报表 多样的格式 动态的数据 报表是我们想要数据展示的一种形态 就像是各种图表 例如 你想查询小明的名字 查询可以
  • 使用Nginx实现多个网站代理[多端口监听][django][资源服务器]

    使用Nginx实现多个网站代理 导航 原文链接 使用Nginx实现多个网站代理 导言 nginx是网站开发后期一个不可缺少的应用 nginx的作用是 请求代理 监听请求并转发给对应端口的进程处理 资源代理 使用nginx直接将服务器资源共享
  • IntelliJ IDEA部署tomcat时出现No artifacts marked for deployment

    这种错误主要是因为没有设置导出包 解决方法 File gt Project Structure gt Artifacts 然后点击ok 然后记得apply ok 此时再回到问题所在 点击Fix即可 或者如下 启动 打开浏览器复制下面网址 h
  • 数学建模--决策树的预测模型的Python实现

    目录 1 算法流程简介 2 算法核心代码 3 算法效果展示 1 算法流程简介 决策树的应用 对泰坦尼克号数据集成员进行预测生死 算法流程还是比较简单的 简单学习一下决策树跟着注释写即可 文章参考 https zhuanlan zhihu c
  • GROUP BY分组单个和多个字段不同条件所查询出来的结果不同

    第一次查询 代码如下 select from test 结果中 按照b列来分 则是 5个a 3个b 按照c列来分 则是 4个甲 4个乙 第二次 查询按照 b列来分组 代码如下 select count a b from test group
  • cordova-plugin-file-transfer cordova plugin下载不到问题解决记录

    环境 cordova 11 1 0 node 16 前提 安卓项目需要支持一些功能 升级到androidX所以一些插件需要更新 使用github方式可能会报ssh需要publicKey相关问题 不想用私人账号进行git github com
  • c++ uint32转为int_轻松实现C/C++各种常见进制相互转换

    这篇文章主要介绍了轻松实现C C 各种常见进制相互转换 文中通过示例代码介绍的非常详细 对大家的学习或者工作具有一定的参考学习价值 需要的朋友们下面随着小编来一起学习学习吧 adsbygoogle window adsbygoogle pu
  • 融云「百幄」之视频会议和直播,让办公桌无限延伸

    2020 年 为避免人员流动造成聚集性感染 全世界各地不少企业开始允许员工居家办公 跨地域 跨终端协同办公行业迎来井喷式增长 视频会议 疫 外爆发 关注 融云 RongCloud 了解协同办公平台更多干货 2022 年 全球疫情仍在蔓延 对
  • Qt,QEvent

    QEvent Class The QEvent class is the base class of all event classes Event objects contain event parameters More include
  • Gabor滤波器与特征提取

    一 Gabor滤波器 Gabor滤波器 最主要使用优势体现在对物体纹理特征的提取上 二维Gabor基函数能够很好地描述哺乳动物初级视觉系统中一对简单视觉神经元的感受野特性 随着小波变换和神经生理学的发展 Gabor变换逐渐演变成二维Gabo