三天的比赛结束了。今年的题比较变态,我已经被虐到无力吐槽了。。不过真是不到最后逼自己一把成不了事。最后一天突破了好多的困难。在最后的一小时里写完了论文,完成了全部的任务。
一开始报选修课的时候选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])
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|