200 likes | 312 Views
影像内定向 ( 框标点的定位 ). 组长: 郭晓虎 指导教员:郭海涛教员 组员: 张莎莎 苏博 李芳林 王儒杰. 定位算子 复习. [ 一 ] 、 定位算子、特征定位的意义. 指运用某种算法来精确确定图像中特征的具体位置的算子. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. Wong-Ttrinder 圆点 定位算子.
E N D
影像内定向(框标点的定位) 组长: 郭晓虎 指导教员:郭海涛教员 组员: 张莎莎 苏博 李芳林 王儒杰
定位算子复习 [一]、定位算子、特征定位的意义 指运用某种算法来精确确定图像中特征的具体位置的算子.
1 1 1 1 1 1 1 1 1 1 1 1 1 Wong-Ttrinder圆点定位算子 [二]、 Wong-Ttrinder圆点定位算子 • Wong和Wei-Hsin利用二值图像重心对圆点进行定位。 • 首先利用阈值T=(最小灰度值+平均灰度值)/2将窗口中的影像二值化为gij(i=0,1,…,n-1;j=0,1,…,m -1) • 然后计算目标重心坐标(x,y)与圆度r
1 1 1 1 1 1 1 1 1 1 1 1 1 Wong-Ttrinder圆点定位算子 [二]、 Wong-Ttrinder圆点定位算子 x=m10/m00 m10 =5+18+35+24+9=91 y=m01/m00 m00 =13 m01 =2+9+20+15+6=52 x=91/13=7.0 y=52/13=4.0
1 1 1 1 1 1 1 1 1 1 1 1 1 Wong-Ttrinder圆点定位算子 [二]、 Wong-Ttrinder圆点定位算子 r=Mx/My
1 1 1 1 1 1 1 1 1 1 1 1 1 Wong-Ttrinder圆点定位算子 [二]、 Wong-Ttrinder圆点定位算子 M20 =4+3+0+3+4=14 M02 =4+3+0+3+4=14 M11 =1-1-1+1=0 Mx=14+0=14 My=14-0=14 r=1.0 r=Mx/My
Wong-Ttrinder圆点定位算子 [二]、 Wong-Ttrinder圆点定位算子 Trinder发现,该算子受二值化影响,误差可达0.5像素,因此他利用原始灰度Wij为权
1 1 1 1 1 1 1 1 Wong-Ttrinder圆点定位算子程序实现 实 现 结 果
圆点定位算子编程实现 int i,j; LPBYTE lpSrc; float x,y; float Mx,My; long m10=0,m01=0,m00=0; long huidu=0,pingjun=0; int yuzhi=0; float M20,M02,M11,yuandu; M20=0.0;M02=0.0;M11=0.0; //定义变量及其初始化 定义变量及其初始化
圆点定位算子编程实现 • BYTE *temp=newBYTE[(Width+L_Width)*Height]; • memcpy(temp,image,(Width+L_Width)*Height); 开辟BYTE型内存空间 空间大小为(Width+L_Width)*Height 把原图像复制到该内存空间中
圆点定位算子编程实现 首先利用阈值T=(最小灰度值+平均灰度值)/2将窗口中的影像二值化为gij(i=0,1,…,n-1;j=0,1,…,m -1) for(j=0;j<Height;j++) { for(i=0;i<(Width+L_Width);i++) { lpSrc=(LPBYTE)image+(Width+L_Width)*(Height-1-j)+i; if( huidu<(*(lpSrc))) huidu=*(lpSrc);//最大灰度 pingjun+=(*lpSrc);//灰度和 }//取得最大灰度和灰度和 } pingjun=pingjun/((Width+L_Width)*Height);//平均灰度 yuzhi=(pingjun+huidu)/2;//取最大灰度和平均灰度的平均为阈值 获取阈值
圆点定位算子编程实现 二值化 for(j=0;j<Height;j++) { for(i=0;i<(Width+L_Width);i++) { lpSrc=(LPBYTE)image+(Width+L_Width)*(Height-1-j)+i; if(*lpSrc>yuzhi)//计算该灰度是否大于阈值 *lpSrc=1; else *lpSrc=0; } }//图像0,1二值化
圆点定位算子编程实现 计算m10,m00,m01 for(j=0;j<Height;j++) for(i=0;i<(Width+L_Width);i++) { lpSrc=(LPBYTE)image+(Width+L_Width)*(Height-1-j)+i; m10+=(*lpSrc)*i; m00+=(*lpSrc); m01+=(*lpSrc)*j;//计算m10,m00,m01; }
圆点定位算子编程实现 x=m10/(m00*1.0); y=m01/(m00*1.0);//计算定位点的x,y坐标 x=m10/m00 计算x,y坐标 y=m01/m00
圆点定位算子编程实现 计算M20,M02,M11 for(j=0;j<Height;j++) { for(i=0;i<(Width+L_Width);i++) { lpSrc=(LPBYTE)image+(Width+L_Width)*(Height-1-j)+i; M20+=(i-x)*(i-x)*(*lpSrc); M02+=(j-y)*(j-y)*(*lpSrc); M11+=(i-x)*(j-y)*(*lpSrc);//计算M20,M02,M11 } }
圆点定位算子编程实现 Mx=(M20+M02)/2+sqrt(((M20-M02)/2)*((M20M02)/2)+M11*M11); My=(M20+M02)/2-sqrt(((M20-M02)/2)*((M20-M02)/2)+M11*M11); yuandu=Mx/My; //计算Mx,My,圆度r 圆度r=Mx/My 计算Mx,My,圆度
圆点定位算子编程实现 //完成在中间画十字的动作 CPoint m_pt1;//定义点 m_pt1=0;//初始化点 m_pt1.x=x; m_pt1.y=y; m_pt1.x=(int)(m_pt1.x+0.5); m_pt1.y=(int)(m_pt1.y+0.5);//四舍五入 标记
圆点定位算子编程实现 //要弹出对话框显示x,y,及圆度(yuandu) CString ss1,ss2,ss3,ss; ss1.Format("%f",x); ss2.Format("%f",y);//因为函数MessageBox()要求输出的 类型必须是字符型,调用Format()函数进行转换 ss3.Format("%f",yuandu); ss="x="+ss1; ss+="y="; ss+=ss2; ss+="yuandu="; ss+=ss3; MessageBox(ss);//弹出消息 显示
圆点定位算子编程实现 memcpy(image,temp,(Width+L_Width)*Height); //还原原图像 Invalidate(); //使窗口无效,图像刷新,新的标记就显示到上面了