1、作业四:图像配准、运动跟踪我编写了矩匹配算法,可以实现模板和图片的匹配。效果如下:第一幅图为模板,在第二幅图上进行了匹配。运动匹配学习了ppt上的算法。程序代码如下:% 主程序:读取图像,调用不同函数(处理算法)。clear clc f=imread(F:matlabshipintuxiangchulifiltertest.jpg);f=f(:,:,2); %取灰度值,第三个值定值figureimshow(f);title(原始图像) ;% % subplot(3,1,1),imshow(f);f1=imnoise(f,gaussian,0.1);imshow(f1);f2=imnoise(f
2、,salt & pepper% figure% imshow(f2);% % subplot(3,1,2),imshow(f2);% title(加入椒盐噪声f3=imnoise(f1,% imshow(f3);% % subplot(2,3,3),imshow(f2);加入白噪声和椒盐噪声% %中值滤波情况ff1=mid_filter(f1,3);f_mid_filter_1=uint8(ff1);imshow(f_mid_filter_1);% subplot(3,1,3),imshow(f_mid_filter_1);3*3中值滤波% ff2=mid_filter(f2,5);% f_m
3、id_filter_2=uint8(ff2);% imshow(f_mid_filter_2);% % subplot(2,3,6),imshow(f_mid_filter_2);5*5中值滤波% %均值滤波情况% ff1=ave_filter(f3,3);% f_ave_filter_1=uint8(ff1);% imshow(f_ave_filter_1);% ff2=ave_filter(f3,5);% f_ave_filter_2=uint8(ff2);% imshow(f_ave_filter_2);%超限邻域平均法% ff1=superave_filter(f2,3);% f_su
4、perave_filter_1=uint8(ff1);% imshow(f_superave_filter_1);3*3超限邻域平均(加入椒盐噪声,阈值50)% %选择式掩膜平滑% ff1=Sel_masking_smoothing(f1);选择式掩膜平滑(白噪声) % 中值滤波算法函数function x2=mid_filter(f,n)x1=double(f);x2=x1;height,width=size(x1);for i=(n+1)/2):height-(n+1)/2) for j=(n+1)/2):width-(n+1)/2) %取窗口元素 temp1=x1(i-(n-1)/2):
5、i+(n-1)/2),j-(n-1)/2):j+(n-1)/2); temp2=temp1(1,: for u=2:n temp2=temp2,temp1(u,:); %将窗口元素转化成行矩阵 end m=median(temp2); %取中值 x2(i,j)=m; %取窗口中值作为像素点end% 均值滤波算法函数function x2=ave_filter(f,n) s=sum(sum(temp1); %求和 x2(i,j)=s/n2; %取窗口均值作为像素点% 超限邻域平均算法函数function x2=superave_filter(f,n)a=50; %求周围n*n-1个点的和 s=(
6、sum(sum(temp1)-x1(i,j)/(n2-1); %判断像素点与周围像素的均值之差是否超过阈值 if abs(x1(i,j)-s)a x2(i,j)=s;% else% x2(i,j)=x1(i,j);% 选择式掩模平滑算法function x2=Sel_masking_smoothing(f)k(1,1:9)=0;for i=3:height-3 for j=3:width-3 %周围9邻近 a1=x1(i-1,j-1:j+1) x1(i,j-1:j+1) x1(i+1,j-1:j+1); s(1)=sum(a1)/9; for b=1:9 k(1)=k(1)+(a1(b)2-s
7、(1)2); %左7邻近 a2=x1(i-2,j-1:j+1) x1(i-1,j-1:j+1) x1(i,j); s(2)=sum(a2)/7;7 k(2)=k(2)+(a2(b)2-s(2)2); %上7邻近 a3=x1(i-1:i+1,j-2) x1(i-1:i+1,j-1) x1(i,j); s(3)=sum(a3)/7; k(3)=k(3)+(a3(b)2-s(3)2); %右7邻近 a4=x1(i+1,j-1:j+1) x1(i+2,j-1: s(4)=sum(a4)/7; k(4)=k(4)+(a4(b)2-s(4)2); %下7邻近 a5=x1(i-1:i+1,j+1)i+1,j
8、+2) s(5)=sum(a5)/7; k(5)=k(5)+(a5(b)2-s(5)2); %左上7邻近 a6=x1(i-2,j-2:j-1) x1(i-1,j-2:j) x1(i,j-1:j); s(6)=sum(a6)/7; k(6)=k(6)+(a6(b)2-s(6)2); %右上7邻近 a7=x1(i,j-1:j) x1(i+1,j-2:j) x1(i+2,j-2: s(7)=sum(a7)/7; k(7)=k(7)+(a7(b)2-s(7)2); %右下7邻近 a8=x1(i,j:j+1) x1(i+1,j:j+2) x1(i+2,j:j+2); s(8)=sum(a8)/7; k(
9、8)=k(8)+(a8(b)2-s(8)2); %左下邻近 a9=x1(i-2,j+1:j+2) x1(i-1,j:j+2) x1(i,j: s(9)=sum(a9)/7; k(9)=k(9)+(a9(b)2-s(9)2); maxr,index=min(k); x2(i,j)=s(index); %Canny算子clearclcclose all1.jpgfigure,imshow(f);原图灰度图q1=double(f);J=q1;height,width=size(q1);%一般情况下,使用高斯平滑滤波器卷积降噪.K为size=5的高斯内核K=1/139*2 4 5 4 2; 4 9 1
10、2 9 4; 5 12 15 12 5; 2 4 5 4 2; %对图像实施高斯滤波 for i=1:height for j=1:width sum=0; for m=1:5 for n=1:% sum=sum+K(m,n)*q1(i,j); if (i-3+m)0 & (i-3+m) (j-3+n)abs(gradX) weight=abs(gradX)/abs(gradY);%权重 grad2=d(i,j-1); grad4=d(i,j+1);%如果x、y方向导数符号相同%像素点位置关系% g1 g2% C% g4 g3 if gradX*gradY grad1=d(i-1,j-1);
11、grad3=d(i+1,j+1);%如果x、y方向导数符号反% g2 g1%g3 g4 grad1=d(i+1,j-1); grad3=d(i-1,j+1);%如果X方向幅度值较大 weight=abs(gradY)/abs(gradX); grad2=d(i-1,j); grad4=d(i+1,j);%g3%g4 C g2% g1 grad1=d(i-1,j+1); grad3=d(i+1,j-1);% g4 C g2% g3 %利用grad1grad4权重关系对梯度进行插值 gradTemp1=weight*grad1+(1-weight)*grad2; gradTemp2=weight*
12、grad3+(1-weight)*grad4; %当前像素的梯度是局部的最大值,可能是边缘点 if gradTemp=gradTemp1 & gradTemp=gradTemp2 D(i,j)=gradTemp; %不可能是边缘点figure,imshow(D,);非极大值抑制后的结果%滞后阈值:高阈值和低阈值EP_MIN=30;EP_MAX=60;EdgeLarge=zeros(height,width);%边缘像素EdgeBetween=zeros(height,width);%记录可能存在的边缘点% dd=zeros(height,width);% for i=2:% for j=2:%
13、 if D(i,j)=D_max;%如果超过高阈值,像素被保留为边缘像素% % EdgeLarge(i,j)=D(i,j);% dd=D(i,j);% else if D(i,j)=D_min & (D(i,j+1)=D_max|D(i,j-1)=D_max.% |D(i+1,j)=D_max|D(i-1,j)=D_max)%在两个阈值之间,暂时保留在此处,接下来进行连接计算% % EdgeBetween(i,j)=D(i,j);% end%低于低阈值的,被排除% figure,imshow(dd,)滞后阈值的结果for i=1: if D(i,j)=EP_MAX%大于最大阈值,为边缘点 Ed
14、geLarge(i,j)=D(i,j); else if D(i,j)=EP_MIN%在两个阈值之间,进行下一步判断 EdgeBetween(i,j)=D(i,j);%把EdgeLarge的边缘连成连续的轮廓MAXSIZE=999999;Queue=zeros(MAXSIZE,2);%用数组模拟队列front=1;%队头rear=1;%队尾edge=zeros(height,width); if EdgeLarge(i,j) %强点入队 Queue(rear,1)=i; Queue(rear,2)=j; rear=rear+1; edge(i,j)=EdgeLarge(i,j); EdgeLa
15、rge(i,j)=0;%避免重复计算 while front=rear%队不空 %队头出队 temp_i=Queue(front,1); temp_j=Queue(front,2); front=front+1; %8-连通域寻找可能的边缘点 %左上方 if EdgeBetween(temp_i-1,temp_j-1)0%把在强点周围的弱点变为强点 EdgeLarge(temp_i-1,temp_j-1)=D(temp_i-1,temp_j-1); EdgeBetween(temp_i-1,temp_j-1)=0; %入队 Queue(rear,1)=temp_i-1; Queue(rear,
16、2)=temp_j-1; %正上方 if EdgeBetween(temp_i-1,temp_j) EdgeLarge(temp_i-1,temp_j)=D(temp_i-1,temp_j); EdgeBetween(temp_i-1,temp_j)=0; Queue(rear,2)=temp_j; %右上方 if EdgeBetween(temp_i-1,temp_j+1) EdgeLarge(temp_i-1,temp_j+1)=D(temp_i-1,temp_j+1); EdgeBetween(temp_i-1,temp_j+1)=0; Queue(rear,2)=temp_j+1; %
17、正左方 if EdgeBetween(temp_i,temp_j-1) EdgeLarge(temp_i,temp_j-1)=D(temp_i,temp_j-1); EdgeBetween(temp_i,temp_j-1)=0; Queue(rear,1)=temp_i; %正右方 if EdgeBetween(temp_i,temp_j+1) EdgeLarge(temp_i,temp_j+1)=D(temp_i,temp_j+1); EdgeBetween(temp_i,temp_j+1)=0; %左下方 if EdgeBetween(temp_i+1,temp_j-1) EdgeLarge(temp_i+1,temp_j-1)=D(temp_i+1,temp_j-1); EdgeBetween(temp_i+1,temp_j-1)=0; Queue(rear,1)=temp_i+1; %正下方 if EdgeBet
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1