OpenCV Gabor滤波器实现纹理提取与缺陷分析

2023-11-15

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

一:Gabor滤波器介绍

Gabor滤波器是OpenCV中非常强大一种滤波器,广泛应用在纹理分割、对象检测、图像分维、文档分析、边缘检测、生物特征识别、图像编码与内容描述等方面。Gabor在空间域可以看做是一个特定频率与方向的正弦平面加上一个应用在正弦平面波上的高斯核

1c78662bf81c351b2fffa6d75e7372f2.png

9123d897a5f2abaa61a2609c4dd5ebe8.png

在实际计算中,一般情况下会根据输入的theta与lambd的不同,得到一系列的Gabor的滤波器组合,然后把它们的结果相加输出,得到最终的输出结果,在纹理提取,图像分割、纹理分类中特别有用,Gabor滤波器的任意组合提供了非常强大的图像分类能力,被认为是最接近于现代深度学习方式进行图像分类的算法之一。Gabor滤波器应用也非常广泛,几乎从图像处理、分割、分类、对象匹配、人脸识别、文字OCR等领域都有应用。

二:OpenCV中的代码实现

OpenCV中已经实现了Gabor滤波器的核函数生成,有了卷积核函数,一切都好办多啦,通过filter2D卷积函数使用Gabor核即可完成Gabor滤波,Gabor核生成的API函数与参数解释如下:

Mat cv::getGaborKernel (
Size ksize, 卷积核大小
double sigma, // 高斯方差
double theta, // 角度
double lambd, // 波长
double gamma,// 纵横比
double psi = CV_PI *0.5, // 相位差
int ktype = CV_64F // Mat数据类型
)

OpenCV中getGaborKernel函数的代码实现如下:

cv::Mat cv::getGaborKernel( Size ksize, double sigma, double theta,
                            double lambd, double gamma, double psi, int ktype )
{
    double sigma_x = sigma;
    double sigma_y = sigma/gamma;
    int nstds = 3;
    int xmin, xmax, ymin, ymax;
    double c = cos(theta), s = sin(theta);
    if( ksize.width > 0)
        xmax = ksize.width/2;
    else
        xmax = cvRound(std::max(fabs(nstds*sigma_x*c), fabs(nstds*sigma_y*s)));
    if( ksize.height > 0)
        ymax = ksize.height/2;
    else
        ymax = cvRound(std::max(fabs(nstds*sigma_x*s), fabs(nstds*sigma_y*c)));
    xmin = -xmax;
    ymin = -ymax;
    CV_Assert( ktype == CV_32F || ktype == CV_64F );
    Mat kernel(ymax - ymin + 1, xmax - xmin + 1, ktype);
    double scale = 1;
    double ex = -0.5/(sigma_x*sigma_x);
    double ey = -0.5/(sigma_y*sigma_y);
    double cscale = CV_PI*2/lambd;
    for( int y = ymin; y <= ymax; y++ )
        for( int x = xmin; x <= xmax; x++ )
        {
            double xr = x*c + y*s;
            double yr = -x*s + y*c;
            double v = scale*std::exp(ex*xr*xr + ey*yr*yr)*cos(cscale*xr + psi);
            if( ktype == CV_32F )
                kernel.at<float>(ymax - y, xmax - x) = (float)v;
            else
                kernel.at<double>(ymax - y, xmax - x) = v;
        }
    return kernel;
}

三:使用Gabor filter提取纹理

使用四个gabor filter实现各种纹理提取,代码实现布匹纹理检测、墙体裂纹检测、斑马线检测。先看效果:

1.布匹纹理检测

布匹纹理图像:

860284ba7b80fb2af50421c5c43fd467.png

检测结果:

d038ea6d8d99c4e0e31c907149f0f6ed.png

2.墙体裂纹提取

墙体裂纹图像

cf1934b65c01cf2e00d8202880f525de.png

检测结果:

24df49226eba9e621866955a0d4ec46d.png

最终效果:

4004c499465dd7b0b1e3343f3ec57bd6.png

3.行车斑马线检测

斑马线图像

a284692168a51776dd334e084372a224.png

检测结果:

23953f9279a862690f28c9c84ce1287b.png

最终效果:

2d8dfce9addb0c219bb4325a7978a643.png

相关代码:

#include<opencv2/opencv.hpp>
#include"iostream"
usingnamespace cv;
usingnamespace std;
int main(int argc, char** argv) {
    Mat src = imread("D:/javaopencv/texture1.png", IMREAD_GRAYSCALE);
    namedWindow("input", CV_WINDOW_AUTOSIZE);
    imshow("input", src);
    Mat src_f;
    src.convertTo(src_f, CV_32F);
    // 参数初始化
    int kernel_size = 3;
    double sigma = 1.0, lambd = CV_PI/8, gamma = 0.5, psi = 0;
    vector<Mat> destArray;
    double theta[4];
    Mat temp;
    // theta 法线方向
    theta[0] = 0;
    theta[1] = CV_PI/4;
    theta[2] = CV_PI / 2;
    theta[3] = CV_PI - CV_PI / 4;
    // gabor 纹理检测器,可以更多,
    // filters = number of thetas * number of lambd
    // 这里lambad只取一个值,所有4个filter
    for(int i = 0; i<4; i++)
    {
        Mat kernel1;
        Mat dest;
        kernel1 = cv::getGaborKernel(cv::Size(kernel_size, kernel_size), sigma, theta[i], lambd, gamma, psi, CV_32F);
        filter2D(src_f, dest, CV_32F, kernel1);
        destArray.push_back(dest);
    }
    // 显示与保存
    Mat dst1, dst2, dst3, dst4;
    convertScaleAbs(destArray[0], dst1);
    imwrite("D:/gabor1.jpg", dst1);
    convertScaleAbs(destArray[1], dst2);
    imwrite("D:/gabor2.jpg", dst2);
    convertScaleAbs(destArray[2], dst3);
    imwrite("D:/gabor3.jpg", dst3);
    convertScaleAbs(destArray[3], dst4);
    imwrite("D:/gabor4.jpg", dst4);
    // 合并结果
    add(destArray[0], destArray[1], destArray[0]);
    add(destArray[2], destArray[3], destArray[2]);
    add(destArray[0], destArray[2], destArray[0]);
    Mat dst;
    convertScaleAbs(destArray[0], dst, 0.2, 0);
    // 二值化显示
    Mat gray, binary;
    // cvtColor(dst, gray, COLOR_BGR2GRAY);
    threshold(dst, binary, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
    imshow("result", dst);
    imshow("binary", binary);
    imwrite("D:/result_01.png", binary);
    waitKey(0);
    return0;
}
下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。


下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。


下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV Gabor滤波器实现纹理提取与缺陷分析 的相关文章

随机推荐

  • 参加电子大赛的经验总结,希望对在校大学生有所帮助

    参加电子大赛的经验总结 赵亮 大连理工大学 0 简介 我是大连理工大学03级的学生 参加了05年9月份举办的全国大学生电子设计大赛 最终我们队获得了辽宁省特等奖 全国二等奖的成绩 全国大学生电子设计大赛每两年举办一次 为全国各高校本科生电子
  • osgEarth的Rex引擎原理分析(一零九)19级瓦片分辨率估算

    目标 一零八 中的问题194 rex的瓦片分级为0 1 19 第0级角度分辨率 180 第1级角度分辨率 180 2 第19级角度分辨率 180 2 19 0 00034332275390625 每个瓦片默认像素为256 256 则每个像素
  • Hive常⽤交互命令与属性配置

    文章目录 Hive常 交互命令与变量属性 一 Hive常用交互命令 1 启动集群 2 查看帮助 3 使用参数 1 在Hive命令行里创建一个表student 并插入1条数据 2 打开hive命令 窗 时定义变量 3 打开verbose模式
  • 解决电脑能够登录QQ,但是不能打开网页的问题

    电脑更新Win11之后每次重新开机都会出现能够登录QQ 但是打开不了网页的问题 解决办法分为三种 方法一 让你的电脑管家帮你 最省事的办法 打开你的安全卫士之类的软件 这里我用的是联想自带的联想电脑管家 首先点右上角的小箱子图标 然后在新的
  • Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收

    http www cnblogs com likehua p 4023667 html
  • 概述计算机网络五层原理体系结构中各层的功能_请收好这一份详细清晰的计算机网络基础学习指南...

    点击上方 Java后端 选择 设为星标 优质文章 及时送达 来源 简书 作者 Carson Ho 链接 jianshu com p 45d27f3e1196 前言 计算机网络基础是研发 运维工程师都需掌握的知识 但往往会被忽略 今天 我将献
  • 【无标题】苹果手机连接罗技鼠标和蓝牙键盘的设置方法

    苹果手机连接罗技鼠标和蓝牙键盘的设置方法如下 iPhone手机打开鼠标设置的路径 设置 辅助功能 触控 辅助触控 打开 请按以下步骤操作 第一步 第二步 第三步 第四步 到这一步以后 屏幕上会出现一个半透明小圆球 同时也可以蓝牙连接鼠标 连
  • 复习之web服务器--apache

    PS Vim复制小技巧 一 实验环境 两台虚拟机 nodea nodeb 配置ip 搭建软件仓库 关闭selinux root ftp Desktop hostnamectl set hostname nodea westos org ro
  • 多文件上传关于input type=file元素

    我们都知道 html5中有个input type file元素 用该元素可以实现页面上传文件的功能 但一般的做法只是简单的在表单中操作 我来研究一下深层东西 想要了解它 就要知道它的内置对象 files 页面上写一个input 然后选俩个图
  • 【Pytorch with fastai】第 16 章 :训练过程

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • linux-网站服务

    一 概念 1 框架结构 LAMP linux apache mysql PHP 系统 服务器程序 数据管理软件 中间软件 二 静态站点 1 安装Apache 1 root localhost yum y install httpd 安装 r
  • CF Round 481 (Div. 3)--D. Almost Arithmetic Progression(思维)

    Polycarp likes arithmetic progressions A sequence a1 a2 an is called an arithmetic progression if for each i 1 i
  • opencv中的merge函数

    文中例子已修改正确 具体原因见评论区 该函数用来合并通道 原型 版本一 void merge const Mat mv size t count OutputArray dst 第一个参数是图像矩阵数组 第二个参数是需要合并矩阵的个数 第三
  • 置信区间计算方法

    文章目录 1 均值的置信区间 2标准差的置信区间 3偏度的置信区间 4 变异系数的置信区间 5参考文献 画图加个阴影 需要用到置信区间的计算方法 SPSS和R应该都能算 这里简单罗列下三阶统计的计算方法 1 均值的置信区间 以前保存的一个表
  • [技术发展-12]:高级研修班-智能汽车-新能源汽车动力系统关键技术

    作者主页 https blog csdn net HiWangWenBing 文章出处 https blog csdn net HiWangWenBing article details 118196111 锂电池和磷酸铁锂电池各有千秋 磷
  • 解析WINDOWS中的DLL文件---经典DLL解读

    在Windows世界中 有无数块活动的大陆 它们都有一个共同的名字 动态链接库 现在就走进这些神奇的活动大陆 找出它们隐藏已久的秘密吧 初窥门径 Windows的基石 随便打开一个系统目录 一眼望去就能看到很多扩展名DLL的文件 这些就是经
  • 基金股票投资调研

    1 本金不多 是买股票还是买基金 十万以上的话 可以买股票 十万以下 买基金 好股票股价都很贵 买一手一两万太正常 你不到十万块 买不了几手 做到行业分散很难 股票需要资金量 而基金往往一块钱就能买 2 可转债与股票 股票 1手 即是100
  • FbxSDK官网文档阅读总结

    FbxSDK官网文档地址 传送门 原文 Normally an FBX application needs only one SDK manager object Most FBX applications need only one sc
  • mysql ---- 全文索引:中文语义分词检索

    转 https www cnblogs com huanzi qch p 15238604 html 介绍 通常情况下 全文检索引擎我们一般会用ES组件 传送门 SpringBoot系列 ElasticSearch 但不是所有业务都有那么大
  • OpenCV Gabor滤波器实现纹理提取与缺陷分析

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 一 Gabor滤波器介绍 Gabor滤波器是OpenCV中非常强大一种滤波器 广泛应用在纹理分割 对象检测 图像分维 文档分析 边缘检测 生物特征识别 图像编码与内容描述