【发布时间】:2014-06-26 06:20:09
【问题描述】:
我需要使用 numpy 和 scipy 将以下 Matlab 脚本 1-1 转换为 Python。
此脚本计算一种称为 LPQ(局部相位量化器)的特征,该特征通常用于人脸识别。
可在此处找到记录 LPQ 特征提取的论文: http://www.ee.oulu.fi/mvg/files/pdf/ICISP08.pdf2
Matlab版本的脚本如下:
function LPQdesc = lpq(img,winSize,mode)
%% Defaul parameters
% Local window size
if nargin<2 || isempty(winSize)
winSize=3; % default window size 3
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(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
% STFT uniform window
% Basic STFT filters
w0=(x*0+1);
w1=exp(complex(0,-2*pi*x*STFTalpha));
w2=conj(w1);
%% 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);
%% 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
尝试在 python 中转换 Matlab LPQ 函数,我生成了以下代码:
# -*- coding: cp1253 -*-
import numpy as np
from scipy.signal import convolve2d
def lpq(img,winSize=3,decorr=0,freqestim=1,mode='nh'):
rho=0.90;
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)
convmode='valid'; # Compute descriptor responses only on part that have full neigborhood. Use 'same' if all pixels are included (extrapolates np.image with zeros).
img=np.float64(img); # Convert np.image to double
r=(winSize-1)/2; # Get radius from window size
x=np.arange(-r,r) # Form spatial coordinates in window
u=np.arange(1,r) # Form coordinates of positive half of the Frequency domain (Needed for Gaussian derivative)
if freqestim==1: # STFT uniform window
# Basic STFT filters
w0=(x*0+1);
w1=np.exp(-2*np.pi*x*STFTalpha)
w2=np.conj(w1);
## Run filters to compute the frequency response in the four points. Store np.real and np.imaginary parts separately
# Run first filter
filterResp=convolve2d(convolve2d(img,w0,convmode),w1,convmode);
# Initilize frequency domain matrix for four frequency coordinates (np.real and np.imaginary parts for each frequency).
shape0, shape1 = filterResp.shape
freqResp=np.zeros((shape0,shape1,8));
# Store filter outputs
freqResp[:,:,0]=np.real(filterResp);
freqResp[:,:,1]=np.imag(filterResp);
# Repeat the procedure for other frequencies
filterResp=convolve2d(convolve2d(img,w1.transpose(),convmode),w0,convmode);
freqResp[:,:,2]=np.real(filterResp);
freqResp[:,:,3]=np.imag(filterResp);
filterResp=convolve2d(convolve2d(img,w1.transpose(),convmode),w1,convmode);
freqResp[:,:,4]=np.real(filterResp);
freqResp[:,:,5]=np.imag(filterResp);
filterResp=convolve2d(convolve2d(img,w1.transpose(),convmode),w2,convmode);
freqResp[:,:,6]=np.real(filterResp);
freqResp[:,:,7]=np.imag(filterResp);
# Read the size of frequency matrix
freqRow,freqCol,freqNum=freqResp.shape;
## Perform quantization and compute LPQ codewords
LPQdesc=np.zeros((freqRow,freqCol)); # Initialize LPQ code word np.image (size depends whether valid or same area is used)
for i in range(0, freqNum):
LPQdesc=LPQdesc+((freqResp[:,:,i])>0)*(2^(i-1));
## Switch format to uint8 if LPQ code np.image is required as output
if mode=='im':
LPQdesc=uint8(LPQdesc);
## Histogram if needed
if mode=='nh' or mode=='h':
LPQdesc=np.histogram(LPQdesc[:],range(256));
## Normalize histogram if needed
if mode=='nh':
LPQdesc[0]=LPQdesc[0]/sum(LPQdesc[0]);
print LPQdesc[0]
return LPQdesc[0]
但是,在为同一图像执行 python 脚本后,我收到以下错误:
Traceback (most recent call last):
File "C:\Users\user\Desktop\source\lpq_parametric.py", line 58, in lpq
filterResp=convolve2d(convolve2d(img,w0,convmode),w1,convmode);
File "C:\Python27\lib\site-packages\scipy\signal\signaltools.py", line 548, in convolve2d
out = sigtools._convolve2d(in1, in2, 1, val, bval, fillvalue)
ValueError: object of too small depth for desired array
由于我是 python 和 scipy/numpy 的菜鸟,我需要帮助使这个 python 脚本处于功能状态。你能帮我修复脚本中的错误吗?
【问题讨论】:
标签: matlab python-2.7 image-processing numpy scipy