clc
close all
clear all
O_eye=imread('eye0.bmp');
bw1=imread('bw.bmp');
figure(2)
imshow(bw1)
x0=171;
y0=100.5;
r0=28.5;
rr=20;
% function [x,y,r,count]=houghcircle(bw1,x0,y0,r0,rr)
% bw1为输入的需检测的圆图象的矩阵,[x0,y0]为估算的定位中心的位置,r0为估算的定位的半径,rr是检测范围的外扩值
[m,n]=size(bw1);
%确定搜索范围,搜索的矩形的四个定点为[e3,e1],[e3,e2],[e4,e1],[e4,e2]
e1=floor(x0-r0)-rr;
if e1<1
e1=1;
end
e2=ceil(x0+r0)+rr;
if e2>n
e2=n;
end
e3=floor(y0-r0)-rr;
if e3<1
e3=1;
end
e4=ceil(y0+r0)+rr;
if e4>m
e4=m;
end
%hough变换求瞳孔中心
flag=1;count=0; %flag为循环控制变量,count记录落在所得圆上的点
while(flag)
flag=0;
bw2=zeros(m,n); %设0矩阵bw2,以bw2为变换空间
for j=e1:e2
for i=e3:e4
if bw1(i,j)==1 %在搜索范围内找到一个值为1点
k=(j-x0)^2+(i-y0)^2-r0^2;
if k>-1600&k<1600 %这个点在有效区内
real=j-x0;imag=y0-i;
theta=atan2(imag,real); %theta为bw1(i,j)相对于(x0,y0)的圆心角
ii=round(i+r0*sin(theta));jj=round(j-r0*cos(theta));
%bw2(ii,jj)为以bw1(i,j)的确定的圆心的位置
bw2(ii,jj)=bw2(ii,jj)+1;
end
end
end
end
a=max(bw2); %bw2中的各列最大值组成向量a
count1=max(a); %count1为a中的最大值
if count1>=count %当求出的值较大时,用新值代替原来的count值,并将r减1再求一次
count=count1;
r0=r0-1;
bw3=bw2;
flag=1;
end
end
[y,x]=find(bw3==count); %最大值的位置坐标
n=length(y);
if n>1 %最大值的位置坐标不唯一时取所有位置的算术平均值
yy=sum(y)/n;
xx=sum(x)/n;
y=yy;
x=xx;
end
r=r0+1; %定位的半径
angle_eye=linspace(0,2*pi,1000);
Gray_eye=rgb2gray(O_eye);
for ai=1:length(angle_eye)
y1=fix(x+(r)*cos(ai));
x1=fix(y+(r)*sin(ai));
Gray_eye(x1,y1)=255;
end
figure(9)
imshow(uint8(Gray_eye))