2014-09-18 数学建模图像处理

 三天的比赛结束了。今年的题比较变态,我已经被虐到无力吐槽了。。不过真是不到最后逼自己一把成不了事。最后一天突破了好多的困难。在最后的一小时里写完了论文,完成了全部的任务。

    一开始报选修课的时候选matlab的原因是想学一下matlab的图像处理。然后课上一直讲的是基础。。没想到接触到图像处理是在数学建模的比赛中。。。第二天和第三天啥也没干,就在死抠图像处理程序。最终在第三天晚上完美解决。从第一天搜集的大量文献中总结筛选,最终决定了“原始照片 → 双边滤波处理(去噪)→ 切割分块取均值后重组图像 → Canny算子边缘检测 → 对比”的最佳线路。

双边滤波:

程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
%%%%%%%%图5.6程序%%%%%%%%%
clear all;
close all;
clc;
img=imread( '附件3 距2400m处的数字高程图.tif' );
% img=mat2gray(img);%2值化
  
%%%%%%%%%%第一个图:显示原始图像%%%%%%%%%%%%
subplot(121);
imshow(img);
title( '原始图像' , 'position' ,[1150,2600]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
%%%%%%%%%%%%%%%%%%%%%双边滤波%%%%%%%%%%%%%%%%%%%%%%%
r=10;        %模板半径
[m n]=size(img);
imgn=zeros(m+2*r+1,n+2*r+1);
imgn(r+1:m+r,r+1:n+r)=img;
imgn(1:r,r+1:n+r)=img(1:r,1:n);                 %扩展上边界
imgn(1:m+r,n+r+1:n+2*r+1)=imgn(1:m+r,n:n+r);    %扩展右边界
imgn(m+r+1:m+2*r+1,r+1:n+2*r+1)=imgn(m:m+r,r+1:n+2*r+1);    %扩展下边界
imgn(1:m+2*r+1,1:r)=imgn(1:m+2*r+1,r+1:2*r);       %扩展左边界
sigma_d=2;
sigma_r=0.1;
[x,y] = meshgrid(-r:r,-r:r);
w1= exp (-(x.^2+y.^2)/(2*sigma_d^2));     %以距离作为自变量高斯滤波器
h=waitbar(0, '图像双边滤波中...' );
for i=r+1:m+r
     for j=r+1:n+r       
         w2= exp (-(imgn(i-r:i+r,j-r:j+r)-imgn(i,j)).^2/(2*sigma_r^2)); %以周围和当前像素灰度差值作为自变量的高斯滤波器
         w=w1.*w2;
         s=imgn(i-r:i+r,j-r:j+r).*w;
         imgn(i,j)=sum(sum(s))/sum(sum(w));
     end
     waitbar(i/m);
end
close(h)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
%%%%%%%%%%%%%%第二个图:滤波后图像%%%%%%%%%%%%%%%%%
% figure;
img1=mat2gray(imgn(r+1:m+r,r+1:n+r));
subplot(122);
imshow(img1);
title( '双边滤波之后的图像' , 'position' ,[1160,2600]);
%%%%%%%%%%%%%%%%


Canny算子边缘检测

 

程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
%%%%%%%%%%%%%%%%%图5.7程序%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;
close all;
clc;
img=imread( '附件3 距2400m处的数字高程图.tif' );
% img=mat2gray(img);%2值化
  
%%%%%%%%%%%%%%%%%%%%%双边滤波%%%%%%%%%%%%%%%%%%%%%%%
r=10;        %模板半径
[m n]=size(img);
imgn=zeros(m+2*r+1,n+2*r+1);
imgn(r+1:m+r,r+1:n+r)=img;
imgn(1:r,r+1:n+r)=img(1:r,1:n);                 %扩展上边界
imgn(1:m+r,n+r+1:n+2*r+1)=imgn(1:m+r,n:n+r);    %扩展右边界
imgn(m+r+1:m+2*r+1,r+1:n+2*r+1)=imgn(m:m+r,r+1:n+2*r+1);    %扩展下边界
imgn(1:m+2*r+1,1:r)=imgn(1:m+2*r+1,r+1:2*r);       %扩展左边界
sigma_d=2;
sigma_r=0.1;
[x,y] = meshgrid(-r:r,-r:r);
w1= exp (-(x.^2+y.^2)/(2*sigma_d^2));     %以距离作为自变量高斯滤波器
h=waitbar(0, '图像双边滤波中...' );
for i=r+1:m+r
     for j=r+1:n+r       
         w2= exp (-(imgn(i-r:i+r,j-r:j+r)-imgn(i,j)).^2/(2*sigma_r^2)); %以周围和当前像素灰度差值作为自变量的高斯滤波器
         w=w1.*w2;
         s=imgn(i-r:i+r,j-r:j+r).*w;
         imgn(i,j)=sum(sum(s))/sum(sum(w));
     end
     waitbar(i/m);
end
close(h)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
%%%%%%%%%%%%%%第二个图:滤波后图像%%%%%%%%%%%%%%%%%
% figure;
img1=mat2gray(imgn(r+1:m+r,r+1:n+r));
subplot(121);
imshow(img1);
title( '未Canny处理前的图像' , 'position' ,[1200,2600])
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  
%%第四个图:第二个图滤波后图像的canny边缘检测处理结果%%
% canny边缘检测
h2=waitbar(0, '绘制双边滤波之后的canny图...' );
img4 = edge(img1, 'canny' );  % 调用canny函数
waitbar(3);
subplot(122)
imshow(img4);  % 显示分割后的图像,即梯度图像
title( 'Canny处理后图像' , 'position' ,[1200,2600])
close(h2);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

由上图可以看出,处理效果并不好。我们进行切割分块取均值后再还原图像的方法处理后再进行Canny算子边缘检测。

图片:

 

程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
%%%%%%%%%%%%%%%%图5.8程序%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;
close all;
clc;
img=imread( '附件3 距2400m处的数字高程图.tif' );
  
  
%%%%%%%%%%%%%%%%%%%%%双边滤波%%%%%%%%%%%%%%%%%%%%%%%
r=10;        %模板半径
[m n]=size(img);
imgn=zeros(m+2*r+1,n+2*r+1);
imgn(r+1:m+r,r+1:n+r)=img;
imgn(1:r,r+1:n+r)=img(1:r,1:n);                 %扩展上边界
imgn(1:m+r,n+r+1:n+2*r+1)=imgn(1:m+r,n:n+r);    %扩展右边界
imgn(m+r+1:m+2*r+1,r+1:n+2*r+1)=imgn(m:m+r,r+1:n+2*r+1);    %扩展下边界
imgn(1:m+2*r+1,1:r)=imgn(1:m+2*r+1,r+1:2*r);       %扩展左边界
sigma_d=2;
sigma_r=0.1;
[x,y] = meshgrid(-r:r,-r:r);
w1= exp (-(x.^2+y.^2)/(2*sigma_d^2));     %以距离作为自变量高斯滤波器
h=waitbar(0, '图像双边滤波中...' );
for i=r+1:m+r
     for j=r+1:n+r       
         w2= exp (-(imgn(i-r:i+r,j-r:j+r)-imgn(i,j)).^2/(2*sigma_r^2)); %以周围和当前像素灰度差值作为自变量的高斯滤波器
         w=w1.*w2;
         s=imgn(i-r:i+r,j-r:j+r).*w;
         imgn(i,j)=sum(sum(s))/sum(sum(w));
     end
     waitbar(i/m);
end
close(h)
  
%%%%%%%%%%%%%%第二个图:滤波后图像%%%%%%%%%%%%%%%%%
img1=mat2gray(imgn(r+1:m+r,r+1:n+r));
  
  
%%%%%%%%%%滤波后图像高程值分块单位化并求均值%%%%%%%%%
a=zeros(575);
b=zeros(575);
c=zeros(575);
d=zeros(575);
H=waitbar(0, '滤波后图像高程值分块单位化并求均值...' );%粗壁障,采用4*4计算单位。
for i=1:1:575;
     for j=1:1:575;
         a(j,i)=img1(4*j-1,4*i-1);
         b(j,i)=img1(4*j-1,4*i);
         c(j,i)=img1(4*j,4*i-1);
         d(j,i)=img1(4*j,4*i);
         a1=a(j,i);b1=b(j,i);c1=c(j,i);d1=d(j,i);
         img2(j,i)=(a1+b1+c1+d1)/16;% 取平均数之后
     end
     waitbar(i/575);
end
close(H);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  
%%%%第三个图:滤波后图像高程值分块单位化后均值排列图%%%%%%
% figure(1);
% imagesc(img1);
% figure(2);
subplot(121)
imshow(img2);
title( '未Canny处理前的图像' , 'position' ,[287,630])
  
  
  
%%%%%%第五个图:第三个图的canny边缘检测处理结果%%%%%%%
% canny边缘检测
img5 = edge(img2, 'canny' );  % 调用canny函数
subplot(122);
imshow(img5);  % 显示分割后的图像,即梯度图像
title( 'Canny处理后图像' , 'position' ,[287,635])
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


 

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值