图像特征提取——韦伯局部描述符(WLD)

一、原理及概述

  韦伯局部描述符(WLD)是一种鲁棒性好、简单高效的局部特征描述符。WLD由两个部分组成:差分激励和梯度方向。

  其具体算法是对于给定的一幅图像,通过对每个像素进行这两个分量的计算来提取其差分激励图像和梯度方向图像,并将这两部分组合成一个二维直方图,进而转化为一个一维直方图,最后利用一维直方图进行分类。[1]

 

  差分激励:差分激励时某像素领域值和减去8倍中心像素值的结果与该像素点的比值。显然,这反映了当前像素点与领域像素点之间的差异。

  在对差分激励有了一个概念性的认识以后,我们来看数学表述:

 

  综合上述公式,我们整合一下:

  通过计算式子,我们知道如果Garctan>0,则表明领域像素的亮度大于当前像素;反之,则表明当前像素在该区域内的亮度较低。

  在计算过程中,为了避免出现输入值过大或过小的情况从而造成不可控的局面,可以通过一个函数将其映射到一个合理范围之内。常用的是sigmoid函数、arctan函数以及对数函数。sigmoid函数如下:

  由于考虑到sigmoid函数的计算量较大,所以往往可以选用arctan函数。

 

  梯度方向:通过计算局部窗内水平方向和垂直方向像素插值之比的反正切变换得到[1]。梯度方向反映的是局部窗内灰度变化的空间分布信息。

  以下为梯度方向的数学表述,注意,xi在下面一张图里。

  为了更加有效地区分灰度窗内灰度变化的分布情况,,我们需要将其扩展到[0,2pi)。设映射f:,有:

  最后,需要对其量化,计算过程如下:

 

  直方图:在图像中利用直方图表示灰度分布。在此处,直方图是用于局部描述算子的变量之一。

  我们在得到了差分激励与梯度方向以后,可以得到两幅新的图像:差分激励图像和梯度方向图像,从而可以得到二维WLD直方图。其中,N为图像的维度,T为方向域的分段个数,每一小块都对应一个差分激励和梯度方向。

  为便于分类,,需要将二维直方图转化为一维直方图。整个过程如下图所示,其实我的理解就是,一行一行的排列,(就像在C里,二维数组其实是个一维数组一样,只是他是一行一行的读取罢了)

 

 

   综合:了解了这几个基本信息以后,我们来看一张图,好详细理解WLD算子:

  对于差分激励来讲,v00,v01,我们知道他是可以看作上图中的滤波算子,同理,v10,v11也是如此。我们通过分别计算完差分激励与梯度方向后,得到有关二者的二维直方图,最后将二维直方图一维化,即为WLD算子的全部操作。

 二、代码及其结果

  以下为WLD算子的代码:

image=imread('lena.jpg');
image=rgb2gray(image);
d_image=double(image);
[xsize ysize] = size(d_image);
EPSILON=0.0000001;
numNeighbors=8; d_differential_excitation = zeros(xsize-1,ysize-1);
d_gradient_orientation = zeros(xsize-1,ysize-1);%计算WLD
for x = 2:xsize-1for y = 2:ysize-1% 计算差励v00=d_image(x-1,y-1)+d_image(x,y-1)+d_image(x+1,y-1)+d_image(x-1,y)+d_image(x+1,y)+d_image(x-1,y+1)+d_image(x,y+1)+d_image(x+1,y+1)-8*d_image(x,y);v01=d_image(x,y);if ( v01 ~= 0 )d_differential_excitation(x,y)=atan(v00/v01);elsed_differential_excitation(x,y)=0;end% 计算梯度方向N2=d_image(x,y-1);         N6=d_image(x,y+1);N4=d_image(x+1,y);         N0=d_image(x-1,y);if ( abs(N0-N4) < EPSILON)		d_gradient_orientation(x,y) = 0;elsev10=N6-N2;		v11=N0-N4;d_gradient_orientation(x,y) = atan(v11/v10);% 映射至0-2pi之间%角度转化为数值 && 梯度方向的量化d_gradient_orientation(x,y)=d_gradient_orientation(x,y)*180/pi;if     (v11 >  EPSILON && v10 >  EPSILON)		d_gradient_orientation(x,y)= d_gradient_orientation(x,y)+ 180;   else if (v11 < -EPSILON && v10 >  EPSILON)      d_gradient_orientation(x,y)= d_gradient_orientation(x,y)+ 180;  else if (v11 < -EPSILON && v10 < -EPSILON)      d_gradient_orientation(x,y)= d_gradient_orientation(x,y); else if (v11 >  EPSILON && v10 < -EPSILON)		d_gradient_orientation(x,y)= d_gradient_orientation(x,y)+ 360; endendendendendend
end
% 对梯度方向值与差励进行量化
% 将差励6等分,梯度8等分
%reshape函数重新调整矩阵的行数、列数、维数。下为将所有元素展现为一列
d_differential_excitation_one = reshape(d_differential_excitation,[size(d_differential_excitation,1)*size(d_differential_excitation,2),1]);
d_gradient_orientation_one = reshape(d_gradient_orientation,[size(d_gradient_orientation,1)*size(d_gradient_orientation,2),1]);
% figure;
%直方图,指定柱状数量为6
H_dif = histogram(d_differential_excitation_one,6);
dif_edge=H_dif.BinEdges;
% figure;
H_gra = histogram(d_gradient_orientation_one,8);
gra_edge=H_gra.BinEdges;
% count 两个矩阵的像素点的直方图归到6*8矩阵 
%循环实现计数功能,即每一节直方图的出现的像素点的个数
histNumbers = zeros(6,8);
for i=1:length(d_differential_excitation_one)temp1 = d_differential_excitation_one(i);temp2 = d_gradient_orientation_one(i);for k = 2:length(dif_edge)if temp1 <= dif_edge(k)g1 = k-1;break;endendfor k = 2:length(gra_edge)if temp2 <= gra_edge(k)g2 = k-1;break;endendhistNumbers(g1,g2) = histNumbers(g1,g2)+1;
end%figure(111);%bar3(histNumbers');
mid_dif=[];%二维直方图的完善
for i=1:length(dif_edge)-1temp = (dif_edge(i)+dif_edge(i+1))/2;temp = round(temp*100)/100;mid_dif = [mid_dif,temp];
end
set(gca, 'XTickLabel',{num2str(mid_dif(1)),num2str(mid_dif(2)),num2str(mid_dif(3)),num2str(mid_dif(4)),num2str(mid_dif(5)),num2str(mid_dif(6))});
mid_gra=[];
for i=1:length(gra_edge)-1temp = (gra_edge(i)+gra_edge(i+1))/2;temp = round(temp*100)/100;temp = temp*2*pi/360;mid_gra = [mid_gra,temp];
endbarhang=[];
for i=1:size(histNumbers,1)barhang=[barhang,histNumbers(i,:)];
end
% bar(barhang);
% % 绘图
figure(123);
subplot(2,2,1),imshow(d_differential_excitation,[]); title('差励')
image_DE = (255* (d_differential_excitation - (-pi/2))/((pi/2)-(-pi/2)));
subplot(2,2,2),imshow(mat2gray(uint8(image_DE)));title('差励归到[0,255]')
subplot(2,2,3),imshow(d_gradient_orientation,[]); title('梯度方向')
image_DO = (255* (d_gradient_orientation - (-pi/2))/((pi/2)-(-pi/2)));
subplot(2,2,4),imshow(mat2gray(uint8(image_DO)));title('梯度方向归到[0,255]')

  结果如下:

  差分激励和梯度方向的两幅图像分别显示如下:

  一维直方图效果为:

 

参考文献;

[1]李思.复杂光照下图像特征提取.(D).西安:长安大学,2018.

 

2019-05-09

17:41:41

 

 

  

转载于:https://www.cnblogs.com/lyxyhhxbk/p/10835780.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux下Nagios的安装与配置

Linux下Nagios的安装与配置 一、Nagios简介 Nagios是一款开源的电脑系统和网络监视工具&#xff0c;能有效监控Windows、Linux和Unix的主机状态&#xff0c;交换机路由器等网络设置&#xff0c;打印机等。在系统或服务状态异常时发出邮件或短信报警第一时间通知网站运维人员&am…

POJ_3262 Protecting the Flowers 【贪心】

一、题面 POJ3262 二、分析 这题要往贪心上面想应该还是很容易的&#xff0c;但问题是要证明为什么比值关系就能满足。 可以选择几个去分析&#xff0c;入1-6 与 2-15 和 1-6 与2-5 和 1-6 与 2- 12。 三、AC代码 1 #include <cstdio>2 #include <iostream>3 #in…

jquery如何阻止子元素继承父元素的事件(又称事件冒泡)

非常简单&#xff0c;子元素上添加如下代码即可 1 $(a).click(function(e){ 2 e.stopPropagation(); 3 }); 老版本为event,现在用e就行 转载于:https://www.cnblogs.com/chengbo2130/p/10152747.html

Beta 冲刺 (7/7)

团队信息 队名&#xff1a;爸爸饿了组长博客&#xff1a;here作业博客&#xff1a;here组员情况 组员1&#xff08;组长&#xff09;&#xff1a;王彬 过去两天完成了哪些任务 协助完成安卓端的整合完成安卓端的美化协助制作宣传视频 接下来的计划 & 还剩下哪些任务 I am d…

Java Web 学习与总结(一)Servlet基础

配置环境&#xff1a;https://www.cnblogs.com/qq965921539/p/9821374.html 简介&#xff1a; Servlet是Sun公司提供的一种实现动态网页的解决方案&#xff0c;在制定J2EE时引入它作为实现了基于Java语言的动态技术&#xff0c;目前流行的Web框架基本都基于Servlet技术&#xf…

堪称经典

程序员作为高智商、高收入、高压力群体&#xff0c;经常会有各种自嘲&#xff0c;而且还天生携带段子手基因。不信看看下面这些段子&#xff0c;一般人哪能懂&#xff01; 1、杀一个程序员不需要用枪&#xff0c;改三次需求就可以了 2、程序员退休后决定练习书法&#xff0c;于…

Judy Beta 第三天

概述 前端部分对于打包的流程以及相关 package.json 的配置都已经比较熟悉了&#xff0c;目前主要负责对新实现的 feature 做测试&#xff0c;以及参考 DAP 为后端明确数据交换的格式及参数内容等。 后端部分按照更新的 wiki 实现了变量展开&#xff0c;并且根据 DAP 的协议流程…

python学习中遇到的问题

2019独角兽企业重金招聘Python工程师标准>>> def contract_str():index 8db_size 8new_table_name b_str(index & (db_size-1))print new_table_name ImportError: No module named mysql.connector import mysql.connector as sql_connector Python保存时提…

Anti-Aliasing SSAA MSAA MLAA SRAA 简介

http://blog.csdn.net/codeboycjy/article/details/6312758 前两天在浏览游民星空的时候&#xff0c;小编居然在文章中挂了一篇技术文章&#xff0c;是关于SRAA的。对于AA的了解很少&#xff0c;正好入职之前还有几天的空闲时间&#xff0c;所以就这个机会把AA的一些基本算法简…

Qt的安装和使用中的常见问题(详细版)

对于太长不看的朋友&#xff0c;可参考Qt的安装和使用中的常见问题&#xff08;简略版&#xff09;。 目录 1、引入2、Qt简介3、Qt版本 3.1 查看安装的Qt版本3.2 查看当前项目使用的Qt版本3.3 查看当前项目使用的QtCreator版本3.4 Linux命令行下查看和使用不同版本的Qt4、Qt模块…

各行业大数据可视化界面参考

转载于:https://www.cnblogs.com/wangsongbai/p/10178096.html

今日听闻这几款手机软件比较火爆 果然名不虚传!

如今的时代&#xff0c;智能手机已经成为我们生活中不可缺少的一部分&#xff0c;大家之所以这么爱玩手机&#xff0c;其实并不是手机本身有多么吸引人&#xff0c;而是安装在手机上的各种各样的APP&#xff0c;比如各种社交软件、音频软件、购物软件以及地图软件等等。下面我们…

postman提取返回值

Postman是做接口测试的&#xff0c;但是很多接口并不是直接就能测&#xff0c;有的需要一些预处理。比如说身份认证&#xff0c;需要传递一个token。如果做网页测试&#xff0c;一般打开登陆界面的时候就会生成一个token&#xff0c;如果返回值是json格式&#xff0c;用Postman…

大数据学习要知道的十大发展趋势,以及学习大数据的几点建议

2016年&#xff0c;近40%的公司正在实施和扩展大数据技术应用&#xff0c;另有30%的公司计划在未来12个月内采用大数据技术&#xff0c;62.5%的公司现在至少有一个大数据项目投入生产&#xff0c;只有5.4%的公司没有大数据应用计划&#xff0c;或者是没有正在进行的大数据项目&…

Hiv:SQuirrel连接hive配置

熟悉了Sqlserver的sqlserver management studio、Oracle的PL/SQL可视化数据库查询分析工具&#xff0c;在刚开始使用hive、phoenix等类sql组件时&#xff0c;一直在苦苦搜寻是否也有类似的工具&#xff0c;不负所望&#xff0c;SQuirrel Sql client 可视化数据库工具基本可满足…

windows下cmd常用的命令

2019独角兽企业重金招聘Python工程师标准>>> windows下常用的命令指示行: windows下 CMD比较常见的命令1. gpedit.msc-----组策略 2. sndrec32-------录音机 3. Nslookup-------IP地址侦测器 4. explorer-------打开资源管理器 5. logoff---------注销命令 6. …

Hive的内置数据类型

Hive的内置数据类型可以分为两大类&#xff1a;(1)、基础数据类型&#xff1b;(2)、复杂数据类型。其中&#xff0c;基础数据类型包括&#xff1a;TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,BINARY,TIMESTAMP,DECIMAL,CHAR,VARCHAR,DATE。下面的表格列出这些基…

ubuntu18.04安装chrome和优化界面

一分钟安装教程chrome教程&#xff01; 1、将下载源加入到系统的源列表&#xff08;添加依赖&#xff09; sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.list.d/ 2、导入谷歌软件的公钥&#xff0c;用于对下载软件进行验证。 wget -q -O - …

Java学习进阶—高级编程

当你已经熟练的掌握了面向对象中的各种概念后&#xff0c;是否会对这些知识是如何使用的产生浓厚的兴趣&#xff1f;本课程主要针对于已经掌握了JAVA核心开发技术的读者准备&#xff0c;讲解了JAVA多线程、常用类库、IO编程、网络编程、类集框架、JDBC等与Java实际应用有关的开…

手把手教你开发基于深度学习的人脸识别【考勤/签到】系统

人脸识别介绍平台环境需求技术点系统流程细节设计 人脸检测人脸关键点定位人脸特征提取 模型的训练模型的部署 MySQL数据库的使用MFC工程的搭建 软件使用 人脸识别介绍 人脸识别技术是一项非接触式、用户友好、非配合型的计算机视觉识别技术。随着机器学习、深度学习等技术的发…