虹膜识别(五):虹膜分割与图像归一化

来源:互联网 发布:手机虚拟网络能否上网 编辑:程序博客网 时间:2024/05/19 22:02

(一)进一步分割

上面已经得到了关于分割区域的虹膜部分如下图所示:

 

内外圆之间的部分认为是要进行识别的部分。

该图的大小为600*800,内外圆的参数前面计算过,这里再给一遍:

mean_circle_in =[324 ; 332 ; 69];

mean_circle_out =[336 ; 340 ; 233];

参数形式为

%                   mean_circle   : 圆心横坐标

%                   mean_circle   :圆心纵坐标

%                   mean_circle   :圆的半径

现在去掉内外圆之外的部分,原理是直接对所有的像素点依次进行检验,比较它们到圆心的距离与所给圆的半径的大小,据此划分内外点。程序如下:

[plain] view plain copy
  1. function img_new = wipeout(img,mean_circle_in,mean_circle_out)  
  2. %------------------------------输入参数-----------------------------  
  3. %   img : 原始图像  
  4. %   mean_circle_in: 分割内圆的参数  
  5. %   mean_circle_out:分割外圆的参数       
  6. %          参数形式:   mean_circle(1) : 圆心横坐标  
  7. %                      mean_circle(2) :圆心纵坐标  
  8. %                      mean_circle(3) :圆的半径      
  9. %                   
  10. %------------------------------输出参数-----------------------------------  
  11. %    img_new:新分割图像  
  12. %[600 800]  
  13. [line,row]=size(img);  %取大小  
  14. for i = 1:line  
  15.     for j = 1:row     %计算距离  
  16.         dis = sqrt((i-mean_circle_out(1)).^2+(j-mean_circle_out(2)).^2);  
  17.         if dis > mean_circle_out(3)   %比较距离大小:外圆取大于  
  18.             img(i,j) = 255;  
  19.         end  
  20.     end  
  21. end  
  22. for i = 1:line  
  23.     for j = 1:row      %计算距离  
  24.         dis1 = sqrt((i-mean_circle_in(1)).^2+(j-mean_circle_in(2)).^2);  
  25.         if dis1 < mean_circle_in(3)     %比较距离大小:内圆取小于  
  26.             img(i,j) = 255;  
  27.         end  
  28.     end  
  29. end  
  30. img_new = img;  

对最初始的灰度图像调用该函数并显示出来如下:

img_new = wipeout(img,mean_circle_in,mean_circle_out);imshow(img_new)

 

 

(二)关于图像归一化

图像归一化是指对图像进行了一系列标准的处理变换,使之变换为一固定标准形式的过程,该标准图像称作归一化图像。

我们这里的归一化是指要把圆环状的图像归一化为矩形的图像,这样既可以压缩图像的大小(去掉圆饼以外的白色不需要的像素)又便于后续的特征提取或者识别操作,处理的原理很简单,想想一下,就是把这个圆饼状从某处切开,然后分别往两边一拉就成矩形状了,当然这个过程会使得图像略有点变形,变形的部分我们用它邻近的像素点代替就可以了,比较这个影响不是很大。

算法上实现也很简单,重点是找到坐标的对应关系,如下图所示:

 

直观图为:


依此编写坐标变换算法:

 

[plain] view plain copy
  1. function [img_rec,M,N] = circle2rectangle(img,mean_circle_in,gama_in,gama_out)  
  2. %------------------------------输入参数-----------------------------  
  3. %圆参数   mean_circle_in:  
  4. %                   mean_circle_in(1) : 圆心横坐标  
  5. %                   mean_circle_in(2) :圆心纵坐标  
  6. %                   mean_circle_in(3) :圆的半径  
  7. %  
  8. %          gama_in:归一化上边缘范围  一般半径的1.4倍较好  
  9. %          gama_out:归一化下边缘范围  一般半径的2.7倍较好  
  10. %-------------------------------------------------------------------  
  11. %------------------------------输出参数-----------------------------  
  12. %       img_rec: 归一化图像---》圆形转换的矩阵图  
  13. %      M,N  转换的矩阵图的 -- 行列的大小  
  14. %         
  15. %-------------------------------------------------------------------  
  16. R_in =  round(mean_circle_in(3)*gama_in);  %限制半径  
  17. R_out = round(mean_circle_in(3)*gama_out);  
  18. %转换的列数  
  19. %N = 800;  
  20. N = round(pi*(R_out+R_in));  
  21. %转换的行数  
  22. % M = 100;  
  23. M = round(R_out-R_in);  
  24. alpha = 2*pi/N;  
  25. for k = 1:N  
  26. %内外圆的坐标矩阵  
  27.     point_A_x(1,k) = mean_circle_in(1) + R_in*cos(k*alpha);  
  28.     point_A_y(1,k) = mean_circle_in(2) + R_in*sin(k*alpha);   
  29.     point_B_x(1,k) = mean_circle_in(1) + R_out*cos(k*alpha);  
  30.     point_B_y(1,k) = mean_circle_in(2) + R_out*sin(k*alpha);   
  31. end  
  32. % figure,plot(point_A_x);  
  33. %重构要求的M*N矩阵坐标  
  34. for i = 1:M  
  35.     point_x(i,:) = round(point_A_x(1,:) + (point_B_x(1,:) - point_A_x(1,:))*i/M) ;   
  36.     point_y(i,:) = round(point_A_y(1,:) + (point_B_y(1,:) - point_A_y(1,:))*i/M) ;  
  37. end  
  38. for i = 1:M      %映射关系  
  39.     for j = 1:N  
  40.         img_rec(i,j) = img(point_x(i,j),point_y(i,j));  
  41.     end  
  42. end  

有了该函数,可以直接对圆心进行操作了,大概确定相应的参数后即可以实现了,例如选的一定的半径范围如下:

>> [img_rec,M,N] = circle2rectangle(img,mean_circle_in,1.4,3);

>> imshow(img_rec)

得到结果为:

 

>> M,N

M =110;N =955

同时新图像的大小也可以看到,相比原图像小了很多。为后续的处理提供了很大的方便。

原创粉丝点击