我觉得,这是指纹领域最漂亮而又非常简单的公式:
θ
=
p
∗
atan2
(
x
−
x
s
,
y
−
y
s
)
.
\theta = p * \text{atan2}(x-x_s, y-y_s).
θ=p∗atan2(x−xs,y−ys).这里
p
p
p代表奇异点的极性(+1或者-1),
(
x
s
,
y
s
)
(x_s,y_s)
(xs,ys)代表奇异点的位置,
(
x
,
y
)
(x,y)
(x,y)代表指纹图像中某点的坐标,
θ
\theta
θ代表该点的方向或者相位。
这个公式既能用来建模指纹方向场的奇异点(singularity),又能用来表示指纹脊线的奇异点,也就是细节点(minutia)。
下面是生成两种方向场奇异点的MATLAB代码。
h = 30; w = 30;
[X,Y] = meshgrid(1:w,1:h);
orient_continuous = -ones(h,w) * pi/2;
figure(1), quiver(X, Y, cos(orient_continuous), sin(orient_continuous),...
'ShowArrowHead','off','AutoScaleFactor',0.7);
axis image
x_singular = w/2;
y_singular = h/2;
polarity = 1;
orient_singular = polarity * atan2(Y-y_singular, X-x_singular);
orient_combine = 0.5*mod(orient_continuous + orient_singular, 2*pi);
figure(2), quiver(X, Y, cos(orient_combine), sin(orient_combine),...
'ShowArrowHead','off','AutoScaleFactor',0.7);
axis image
polarity = -1;
orient_singular = polarity * atan2(Y-y_singular, X-x_singular);
orient_combine = 0.5*mod(orient_continuous + orient_singular, 2*pi);
figure(3), quiver(X, Y, cos(orient_combine), sin(orient_combine),...
'ShowArrowHead','off','AutoScaleFactor',0.7);
axis image
下面是生成两个朝向的指纹细节点(脊线奇异点)的MATLAB代码。
h = 500; w = 500;
freq = 0.01;
[X,Y] = meshgrid(1:w,1:h);
phase_continuous = 2*pi*freq*Y;
figure(1), subplot(1,3,1), imshow(cos(phase_continuous),[]);
x_minu = w/2;
y_minu = h/2;
polarity = 1;
phase_minu = polarity * atan2(Y-y_minu, X-x_minu);
subplot(1,3,2), imshow(cos(phase_continuous+phase_minu),[]);
polarity = -1;
phase_minu = polarity * atan2(Y-y_minu, X-x_minu);
subplot(1,3,3), imshow(cos(phase_continuous+phase_minu),[]);