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

来源:互联网 发布:线割编程软件哪个好 编辑:程序博客网 时间:2024/06/06 01:57
 三天的比赛结束了。今年的题比较变态,我已经被虐到无力吐槽了。。不过真是不到最后逼自己一把成不了事。最后一天突破了好多的困难。在最后的一小时里写完了论文,完成了全部的任务。

    一开始报选修课的时候选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])
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


 

0 0
原创粉丝点击