圖像特征提取——局部圖結構(LGS)及matlab代碼實現
一、概述與原理
局部圖結構(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
圖像特征提取——局部圖結構(LGS)及matlab代碼實現