lpq函数matlab,LPQ算法总结

本文为原创,转载请说明出处哈~

LPQ(Local Phase Quantization)算法的原理是假设平滑函数h(x)中心对称,则其傅里叶变换为H(u),对所有H(u)≥0有∠G(u)= ∠F(u),其中F(u)和G(u)分别为原图像和平滑后图像的傅里叶变换,因而在H(u)≥0条件下,图像对平滑有不变性。

为使H(u)≥0,a取为不超过第一个过零点的频率点,其值为a=1/winSize(winSize为输入参数)。分别用f(x)对u1=(a,0),u2=(0,a),u3=(a,a),u4=(a,-a)四个点作STFT,然后分别把四个点的实部和虚部分开,形成一个向量W=[Re{F(u1,x)},Re{F(u2,x)},Re{F(u3,x)},Re{F(u4,x)},Im{F(u1,x)},Im{F(u2,x)},Im{F(u3,x)},Im{F(u4,x)}]T。

最终得到LPQ变换即为Fx=W*fx。然后对参数进行统计分析,若参数是相关的,则用奇异值分解去相关并且量化。

LPQ算法的matlab实现如下(代码引用自UNIVERSITY OF OULU,DEPARTMENT OF COMPUTER SCIENCE AND ANGINEERING):

function LPQdesc = lpq(img,winSize,decorr,freqestim,mode)

% Funtion LPQdesc=lpq(img,winSize,decorr,freqestim,mode) computes the Local Phase Quantization (LPQ) descriptor

% for the input image img. Descriptors are calculated using only valid pixels i.e. size(img)-(winSize-1).

%

% Inputs: (All empty or undefined inputs will be set to default values)

% img = N*N uint8 or double, format gray scale image to be analyzed.

% winSize = 1*1 double, size of the local window. winSize must be odd number and greater or equal to 3 (default winSize=3).

% decorr = 1*1 double, indicates whether decorrelation is used or not. Possible values are:

% 0 -> no decorrelation,

% (default) 1 -> decorrelation

% freqestim = 1*1 double, indicates which method is used for local frequency estimation. Possible values are:

% (default) 1 -> STFT with uniform window (corresponds to basic version of LPQ)

% 2 -> STFT with Gaussian window (equals also to Gaussian quadrature filter pair)

% 3 -> Gaussian derivative quadrature filter pair.

% mode = 1*n char, defines the desired output type. Possible choices are:

% (default) 'nh' -> normalized histogram of LPQ codewords (1*256 double vector, for which sum(result)==1)

% 'h' -> un-normalized histogram of LPQ codewords (1*256 double vector)

% 'im' -> LPQ codeword image ([size(img,1)-r,size(img,2)-r] double matrix)

%

% Output:

% LPQdesc = 1*256 double or size(img)-(winSize-1) uint8, LPQ descriptors histogram or LPQ code image (see "mode" above)

%

% Example usage:

% img=imread('cameraman.tif');

% LPQhist = lpq(img,3);

% figure; bar(LPQhist);

%

% Version published in 2010 by Janne Heikkil? Esa Rahtu, and Ville Ojansivu

% Machine Vision Group, University of Oulu, Finland

%% Defaul parameters

% Local window size

if nargin<2 || isempty(winSize)

winSize=3; % default window size 3

end

% Decorrelation

if nargin<3 || isempty(decorr)

decorr=1; % use decorrelation by default

end

rho=0.90; % Use correlation coefficient rho=0.9 as default

% Local frequency estimation (Frequency points used [alpha,0], [0,alpha], [alpha,alpha], and [alpha,-alpha])

if nargin<4 || isempty(freqestim)

freqestim=1; %use Short-Term Fourier Transform (STFT) with uniform window by default

end

STFTalpha=1/winSize; % alpha in STFT approaches (for Gaussian derivative alpha=1)

sigmaS=(winSize-1)/4; % Sigma for STFT Gaussian window (applied if freqestim==2)

sigmaA=8/(winSize-1); % Sigma for Gaussian derivative quadrature filters (applied if freqestim==3)

% Output mode

if nargin<5 || isempty(mode)

mode='nh'; % return normalized histogram as default

end

% Other

convmode='valid'; % Compute descriptor responses only on part that have full neigborhood. Use 'same' if all pixels are included (extrapolates image with zeros).

%% Check inputs

if size(img,3)~=1

error('Only gray scale image can be used as input');

end

if winSize<3 || rem(winSize,2)~=1

error('Window size winSize must be odd number and greater than equal to 3');

end

if sum(decorr==[0 1])==0

error('decorr parameter must be set to 0->no decorrelation or 1->decorrelation. See help for details.');

end

if sum(freqestim==[1 2 3])==0

error('freqestim parameter must be 1, 2, or 3. See help for details.');

end

if sum(strcmp(mode,{'nh','h','im'}))==0

error('mode must be nh, h, or im. See help for details.');

end

%% Initialize

img=double(img); % Convert image to double

r=(winSize-1)/2; % Get radius from window size

x=-r:r; % Form spatial coordinates in window

u=1:r; % Form coordinates of positive half of the Frequency domain (Needed for Gaussian derivative)

%% Form 1-D filters

if freqestim==1 % STFT uniform window

% Basic STFT filters

w0=(x*0+1);

w1=exp(complex(0,-2*pi*x*STFTalpha));

w2=conj(w1);

elseif freqestim==2 % STFT Gaussian window (equals to Gaussian quadrature filter pair)

% Basic STFT filters

w0=(x*0+1);

w1=exp(complex(0,-2*pi*x*STFTalpha));

w2=conj(w1);

% Gaussian window

gs=exp(-0.5*(x./sigmaS).^2)./(sqrt(2*pi).*sigmaS);

% Windowed filters

w0=gs.*w0;

w1=gs.*w1;

w2=gs.*w2;

% Normalize to zero mean

w1=w1-mean(w1);

w2=w2-mean(w2);

elseif freqestim==3 % Gaussian derivative quadrature filter pair

% Frequency domain definition of filters

G0=exp(-x.^2*(sqrt(2)*sigmaA)^2);

G1=[zeros(1,length(u)),0,u.*exp(-u.^2*sigmaA^2)];

% Normalize to avoid small numerical values (do not change the phase response we use)

G0=G0/max(abs(G0));

G1=G1/max(abs(G1));

% Compute spatial domain correspondences of the filters

w0=real(fftshift(ifft(ifftshift(G0))));

w1=fftshift(ifft(ifftshift(G1)));

w2=conj(w1);

% Normalize to avoid small numerical values (do not change the phase response we use)

w0=w0/max(abs([real(max(w0)),imag(max(w0))]));

w1=w1/max(abs([real(max(w1)),imag(max(w1))]));

w2=w2/max(abs([real(max(w2)),imag(max(w2))]));

end

%% Run filters to compute the frequency response in the four points. Store real and imaginary parts separately

% Run first filter

filterResp=conv2(conv2(img,w0.',convmode),w1,convmode);%卷积

% Initilize frequency domain matrix for four frequency coordinates (real and imaginary parts for each frequency).

freqResp=zeros(size(filterResp,1),size(filterResp,2),8);

% Store filter outputs

freqResp(:,:,1)=real(filterResp);

freqResp(:,:,2)=imag(filterResp);

% Repeat the procedure for other frequencies

filterResp=conv2(conv2(img,w1.',convmode),w0,convmode);

freqResp(:,:,3)=real(filterResp);

freqResp(:,:,4)=imag(filterResp);

filterResp=conv2(conv2(img,w1.',convmode),w1,convmode);

freqResp(:,:,5)=real(filterResp);

freqResp(:,:,6)=imag(filterResp);

filterResp=conv2(conv2(img,w1.',convmode),w2,convmode);

freqResp(:,:,7)=real(filterResp);

freqResp(:,:,8)=imag(filterResp);

% Read the size of frequency matrix

[freqRow,freqCol,freqNum]=size(freqResp);

%% If decorrelation is used, compute covariance matrix and corresponding whitening transform

if decorr == 1

% Compute covariance matrix (covariance between pixel positions x_i and x_j is rho^||x_i-x_j||)

[xp,yp]=meshgrid(1:winSize,1:winSize);%直角坐标系

pp=[xp(:) yp(:)];

dd=dist(pp,pp');%欧式几何距离

C=rho.^dd;

% Form 2-D filters q1, q2, q3, q4 and corresponding 2-D matrix operator M (separating real and imaginary parts)

q1=w0.'*w1;

q2=w1.'*w0;

q3=w1.'*w1;

q4=w1.'*w2;

u1=real(q1); u2=imag(q1);

u3=real(q2); u4=imag(q2);

u5=real(q3); u6=imag(q3);

u7=real(q4); u8=imag(q4);

M=[u1(:)';u2(:)';u3(:)';u4(:)';u5(:)';u6(:)';u7(:)';u8(:)'];

% Compute whitening transformation matrix V

D=M*C*M';

A=diag([1.000007 1.000006 1.000005 1.000004 1.000003 1.000002 1.000001 1]); % Use "random" (almost unit) diagonal matrix to avoid multiple eigenvalues.

[U,S,V]=svd(A*D*A);%奇异值分解

% In order to avoid any sign problems in SVM, force the sign of the largest magnitude element in each singular vector to be positive

[~,ii]=max(abs(V),[],1);

V=V*diag(ones(1,size(V,2))-2*double(V((ii+(0:(length(ii)-1))*size(V,1)))

% Reshape frequency response

freqResp=reshape(freqResp,[freqRow*freqCol,freqNum]);%改变输入数组的维数

% Perform whitening transform

freqResp=(V.'*freqResp.').';

% Undo reshape

freqResp=reshape(freqResp,[freqRow,freqCol,freqNum]);

end

%% Perform quantization and compute LPQ codewords

LPQdesc=zeros(freqRow,freqCol); % Initialize LPQ code word image (size depends whether valid or same area is used)

for i=1:freqNum

LPQdesc=LPQdesc+(double(freqResp(:,:,i))>0)*(2^(i-1));%编码

end

%% Switch format to uint8 if LPQ code image is required as output

if strcmp(mode,'im')

LPQdesc=uint8(LPQdesc);

end

%% Histogram if needed

if strcmp(mode,'nh') || strcmp(mode,'h')

LPQdesc=hist(LPQdesc(:),0:255);

end

%% Normalize histogram if needed

if strcmp(mode,'nh')

LPQdesc=LPQdesc/sum(LPQdesc);

end

在利用LPQ进行图像匹配的时候,若效果不明显,可以尝试使用分块图像,就是先把图像划分成子图像,再对每个子图像计算LPQ直方图,把这些子图像的LPQ直方图拼接起来作为图像的LPQ特征值再进行匹配,效果会明显改善。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值