一、概述与原理
局部图结构(Local Graph Structure)是由Abusham E A提出的,该算子能将图像的局部特征信息很好的表示,其对于纹理的分辨能力很强,对灰度的单调变化不敏感。
关注一个3*4的区域,LGS与6个领域像素有关。如下图[1]所示:
算子的基本原理:从灰色点出发,沿着左上方走一个“8”字路径。(例如:图中路径即为7-9-5-7-6-7-7-6-7)在行进过程中,如果下一个节点比当前节点要更大,则为0,否则取1.(例如从起点7出发,到下一个节点9,因为9>7,则取0)随着在路径中两两节点的比较,将会得到一个01序列,我们视之为一个二进制数。显然上图中我们所得到的二进制数为01010110.在经过二进制到十进制的转换后,展示的数是86.
二、LGS算子的数学表达
在对局部结构图有了一个基本的认识后,我们再引入数学表述,这样能更好理解数学公式!
其中(xd,yd)表示原中心像素位置。
该算子本质上就是一个判断,然后进行二进制转十进制的加和,非常简单!
ps:我觉得这个算子在另一个方面是很巧妙的,它恰好有8为二进制序列,这样从00000000-11111111恰好能表达十进制数中的0-255.也就是对于每一个像素点而言,是从[0,255]->[0,255]的。具有这样的映射关系,还是比较巧妙的,再次生成的图像不需要更改数据类型和灰度范围就能有比较好的效果。
三、综合评价
1.在复杂光照下,LGS算子是有极大的效果的,因为当光照不同时,对于同一个局部信息而言,相对灰度值大小并不会发生变化。
2.个人以为,LGS对待图片旋转即会失效,所以对于所有图像,或者多数变换类型而言,不具有普适性。
四、代码实现
main.m
clear clc image = imread('lena.jpg'); %读取图片 lgs = LGS(image); %调用LGS算子的函数 figure(1); imshow(lgs,[]); %显示图像 title('LGS'); figure(2); hist(lgs); title('LGS直方图') %显示直方图
lgs.m
function lgs = LGS(img) img = rgb2gray(img); off_part1_x = [0,-1,-1,0]; off_part1_y = [0,-1,1,0]; off_part2_x = [0,1,2,2,1,0]; off_part2_y = [0,0,-1,1,0,0]; for i=2:size(img,1)-1 for j=2:size(img,2)-2 bina = []; for k=2:length(off_part1_x) if img(i+off_part1_y(k),j+off_part1_x(k)) <= img(i+off_part1_y(k-1),j+off_part1_x(k-1)) bina=[bina,'0']; else bina=[bina,'1']; end end for k=2:length(off_part2_x) if img(i+off_part2_y(k),j+off_part2_x(k)) <= img(i+off_part2_y(k-1),j+off_part2_x(k-1)) bina=[bina,'0']; else bina=[bina,'1']; end end nums = bin2dec(bina); lgs(i,j)=nums; end end
代码运行结果:
参考文献:
[1]Abusham E A. Face verification using Local Graph Stucture (LGS)[C]// International Symposium on Biometrics and Security Technologies. IEEE, 2014: 79-83
2019-05-05
21:37:50