我正在尝试在基于Minutiae的指纹验证上构建程序,并且为了进行预处理,我需要调整脊的方向,并在互联网上找到了相关功能,但无法正确理解。
我尝试阅读许多有关细节提取的研究论文。
这是我在互联网上找到的功能
def ridge_orient(im, gradientsigma, blocksigma, orientsmoothsigma):
rows,cols = im.shape;
#Calculate image gradients.
sze = np.fix(6*gradientsigma);
if np.remainder(sze,2) == 0:
sze = sze+1;
gauss = cv2.getGaussianKernel(np.int(sze),gradientsigma);
f = gauss * gauss.T;
fy,fx = np.gradient(f); #Gradient of Gaussian
#Gx = ndimage.convolve(np.double(im),fx);
#Gy = ndimage.convolve(np.double(im),fy);
Gx = signal.convolve2d(im,fx,mode='same');
Gy = signal.convolve2d(im,fy,mode='same');
Gxx = np.power(Gx,2);
Gyy = np.power(Gy,2);
Gxy = Gx*Gy;
#Now smooth the covariance data to perform a weighted summation of the data.
sze = np.fix(6*blocksigma);
gauss = cv2.getGaussianKernel(np.int(sze),blocksigma);
f = gauss * gauss.T;
Gxx = ndimage.convolve(Gxx,f);
Gyy = ndimage.convolve(Gyy,f);
Gxy = 2*ndimage.convolve(Gxy,f);
# Analytic solution of principal direction
denom = np.sqrt(np.power(Gxy,2) + np.power((Gxx - Gyy),2)) + np.finfo(float).eps;
sin2theta = Gxy/denom; # Sine and cosine of doubled angles
cos2theta = (Gxx-Gyy)/denom;
if orientsmoothsigma:
sze = np.fix(6*orientsmoothsigma);
if np.remainder(sze,2) == 0:
sze = sze+1;
gauss = cv2.getGaussianKernel(np.int(sze),orientsmoothsigma);
f = gauss * gauss.T;
cos2theta = ndimage.convolve(cos2theta,f); # Smoothed sine and cosine of
sin2theta = ndimage.convolve(sin2theta,f); # doubled angles
orientim = np.pi/2 + np.arctan2(sin2theta,cos2theta)/2;
return(orientim);
答案 0 :(得分:0)
此代码计算structure tensor,这是一种以健壮的方式计算局部方向的方法。它按像素获得对称的2x2矩阵(张量)(变量Gxx
,Gyy
和Gxy
),其特征向量表示局部取向,其特征值表示局部变化的强度。因为它返回的是矩阵而不是简单的梯度向量,所以您可以将均匀区域与类似十字架的结构区分开,两者都不具有强梯度,但是十字架具有很强的局部变化。
fy,fx = np.gradient(f);
是获取高斯导数内核的一种非常糟糕的方法。在这里,您只是失去了高斯梯度的所有好处,而是计算了梯度的有限差分近似值。
接下来,该代码没有使用高斯的可分性来减少计算复杂度,这也是一个遗憾。
在this blog post中,我讨论了高斯滤波和高斯导数的理论,在this other one中,我详细介绍了一些实际方面(使用MATLAB,但这应该很容易扩展到Python)。