www.pudn.com > eyedemo.rar > normaliseiris.m
% normaliseiris - 通过将旋转的环形区域转换为有限维的矩形区域实现归一化
%
% 使用:
% [polar_array, polar_noise] = normaliseiris(image, x_iris, y_iris, r_iris,...
% x_pupil, y_pupil, r_pupil,eyeimage_filename, radpixels, angulardiv)
%
% 参数:
% image - 用来处理的输入图像
% x_iris - 虹膜边界曲线圆心的横坐标
% y_iris - 虹膜边界曲线圆心的纵坐标
% r_iris - 虹膜边界曲线的半径
% x_pupil - 瞳孔边界曲线圆心的横坐标
% y_pupil - 瞳孔边界曲线圆心的横坐标
% r_pupil - 瞳孔边界曲线半径
% eyeimage_filename - 输入眼部图像的原始图像
% radpixels - 延半径方向的辐射分量, 定义归一化后图像的竖直分量
% angulardiv - 延角度方向的旋转分量, 定义归一化后图像的水平分量
% 输出:
% polar_array
% polar_noise
function [polar_array, polar_noise] = normaliseiris(image, x_iris, y_iris, r_iris,...
x_pupil, y_pupil, r_pupil,eyeimage_filename, radpixels, angulardiv);
global DIAGPATH
radiuspixels = radpixels + 2;
angledivisions = angulardiv-1;
r = 0:(radiuspixels-1);
theta = 0:2*pi/angledivisions:2*pi;
x_iris = double(x_iris);
y_iris = double(y_iris);
r_iris = double(r_iris);
x_pupil = double(x_pupil);
y_pupil = double(y_pupil);
r_pupil = double(r_pupil);
% 计算瞳孔圆心与虹膜圆心间距
ox = x_pupil - x_iris;
oy = y_pupil - y_iris;
if ox <= 0
sgn = -1;
elseif ox > 0
sgn = 1;
end
if ox==0 && oy > 0
sgn = 1;
end
r = double(r);
theta = double(theta);
a = ones(1,angledivisions+1)* (ox^2 + oy^2);
% 为防止ox=0做一些事情
if ox == 0
phi = pi/2;
else
phi = atan(oy/ox);
end
b = sgn.*cos(pi - phi - theta);
%将半径以角度的函数计算
r = (sqrt(a).*b) + ( sqrt( a.*(b.^2) - (a - (r_iris^2))));
r = r - r_pupil;
rmat = ones(1,radiuspixels)'*r;
rmat = rmat.* (ones(angledivisions+1,1)*[0:1/(radiuspixels-1):1])';
rmat = rmat + r_pupil;
%排除瞳孔与虹膜,虹膜与巩膜边界处的值
% 因为它们可能不与虹膜区域的值相应并将引入噪声
% 即不讲边界外的圆环当作虹膜数据
rmat = rmat(2:(radiuspixels-1), :);
% 计算环形虹膜区域中的点在笛卡儿坐标下的位置
xcosmat = ones(radiuspixels-2,1)*cos(theta);
xsinmat = ones(radiuspixels-2,1)*sin(theta);
xo = rmat.*xcosmat;
yo = rmat.*xsinmat;
xo = x_pupil+xo;
yo = y_pupil-yo;
% 通过插值将像素值转入对应的归一化之后的图像像素中
[x,y] = meshgrid(1:size(image,2),1:size(image,1));
polar_array = interp2(x,y,image,xo,yo);
% 创建噪声矩阵,它带有在极座标polar_array中的NaN的定位
polar_noise = zeros(size(polar_array));
coords = find(isnan(polar_array));
polar_noise(coords) = 1;
polar_array = double(polar_array)./255;
% 开始诊断,输出覆盖有圆环的眼部图像
% 除去虹膜之外的点来写入环形模板
coords = find(xo > size(image,2));
xo(coords) = size(image,2);
coords = find(xo < 1);
xo(coords) = 1;
coords = find(yo > size(image,1));
yo(coords) = size(image,1);
coords = find(yo<1);
yo(coords) = 1;
xo = round(xo);
yo = round(yo);
xo = int32(xo);
yo = int32(yo);
ind1 = sub2ind(size(image),double(yo),double(xo));
image = uint8(image);
image(ind1) = 255;
%得到外圆边界像素坐标
[x,y] = circlecoords([x_iris,y_iris],r_iris,size(image));
ind2 = sub2ind(size(image),double(y),double(x));
%得到内圆边界像素坐标
[xp,yp] = circlecoords([x_pupil,y_pupil],r_pupil,size(image));
ind1 = sub2ind(size(image),double(yp),double(xp));
image(ind2) = 255;
image(ind1) = 255;
% 在原图上写入圆环
w = cd;
cd('E:\MATLAB7\work\diagnostics');
%imwrite(image,[eyeimage_filename,'-normal.jpg'],'jpg');
cd(w);
%结束诊断
%执行特征编码前替换NaN噪声
coords = find(isnan(polar_array));
polar_array2 = polar_array;
polar_array2(coords) = 0.5;
avg = sum(sum(polar_array2)) / (size(polar_array,1)*size(polar_array,2));
polar_array(coords) = avg;