网站首页模版,网页制作作业代码,有名设计网站,电商网站介绍uu们#xff01;大家好#xff0c;欢迎来到数字图像处理第五章节内容的学习#xff0c;在本章中有关空间滤波的理论学习是十分重要的#xff0c;所以建议大家要去用心的学习本章#xff0c;在之后的传感器的相关图像采集时#xff0c;不可避免的会有噪声等的影响#xf… uu们大家好欢迎来到数字图像处理第五章节内容的学习在本章中有关空间滤波的理论学习是十分重要的所以建议大家要去用心的学习本章在之后的传感器的相关图像采集时不可避免的会有噪声等的影响所以滤波等操作是解决其中的方法接下来我们将开始学习。
一、实验
实验目的通过实验掌握空间滤波的基本概念和方法
实验内容
1、掌握平滑线性滤波的概念和方法 1均值滤波 2加权均值滤波 二、掌握统计排序滤波的概念和方法
1、中值滤波 模板的作用只是完成“取出邻域中的像素”然后从小到大排序 取中间的第mn1/2个像素的灰度值为输出灰度值。 2、最大值滤波和最小值滤波 模板的作用只是完成“取出邻域中的像素”然后从小到大排序 取其中的第mn个像素的灰度值最大值或第1个像素的灰度 值最小值为输出灰度值。
如图例所示 三、具体要求
1、基本编程 1用均值滤波和加权均值滤波2种方法对选图自己选与图1有 相似分布的图不能用图1进行滤波选用的模板大小自选3个 2用均值滤波、加权均值滤波、中值滤波、最大值滤波和最小值滤 波5种方法对选图自己选与图2类似有噪声污染的图不能用图 2进行滤波选用的模板大小自选3个 3得到的5种滤波方法每种滤波方法对应3个不同大小的模板 因此每种方法滤波获得3张滤波图以及1张原图共4张子图显示 在一个窗口里每个子图的抬头标注相应名称如“均值滤波3*3”。 4“编程及结果”中的编程内容必须包含2种编写方式 a)底层编写 b)函数调用
2、 实际应用 请对一幅自选的模糊图像Blurredimage进行滤波处理达到除 去模糊增强细节和对比度的目的。
四、代码
函数调用版
% 读取图像
Aimread(1.png) % 读取名为1.png的图像到变量A中
Bimread(1.png) % 再次读取相同的图像到变量B中这里可能是为了后续不同的处理% 定义不同大小的均值滤波器
p1 fspecial(average, [3 3]); % 创建一个3x3的均值滤波器
p2 fspecial(average, [5 5]); % 创建一个5x5的均值滤波器
p3 fspecial(average, [7 7]); % 创建一个7x7的均值滤波器% 应用不同大小的均值滤波器
L1 imfilter(A, p1); % 将3x3均值滤波器应用于图像A
L2 imfilter(A, p2); % 将5x5均值滤波器应用于图像A
L3 imfilter(A, p3); % 将7x7均值滤波器应用于图像A% 显示原始图像和滤波后的图像 figure; % 创建一个新的图形窗口
subplot(2, 3, 2); % 创建一个2行3列的子图布局并定位到第2个子图位置
imshow(A); % 显示图像A
title(原图像); % 设置子图的标题为“原图像”
subplot(2, 3, 4);imshow(L1); % 显示3x3均值滤波后的图像L1
title(3x3 均值滤波); % 设置子图的标题为“3x3 均值滤波”
subplot(2, 3, 5);imshow(L2); % 显示5x5均值滤波后的图像L2
title(5x5 均值滤波); % 设置子图的标题为“5x5 均值滤波”
subplot(2, 3, 6);imshow(L3); % 显示7x7均值滤波后的图像L3
title(7x7 均值滤波); % 设置子图的标题为“7x7 均值滤波”% 定义加权均值滤波器的模板
h_1 [0.1 0.2 0.1; 0.2 0.4 0.2;0.1 0.2 0.1]; % 3x3加权均值滤波器模板
h_2 [1/25 1/25 1/35 1/25 1/25; % 5x5加权均值滤波器模板1/25 1/15 1/10 1/15 1/25;1/35 1/10 1/5 1/10 1/35;1/25 1/15 1/10 1/15 1/25;1/25 1/25 1/35 1/25 1/25];
h_3 [1/49 1/49 1/60 1/70 1/60 1/49 1/49; % 7x7加权均值滤波器模板1/49 1/40 1/35 1/30 1/35 1/40 1/49;1/60 1/35 1/25 1/15 1/25 1/35 1/60;1/70 1/25 1/15 1/5 1/15 1/25 1/70;1/60 1/35 1/25 1/15 1/25 1/35 1/60;1/49 1/40 1/35 1/30 1/35 1/40 1/49;1/49 1/49 1/60 1/70 1/60 1/49 1/49];% 使用same选项保持输出图像大小与输入相同
A_1 imfilter(A, h_1, same); % 应用3x3加权均值滤波器并保持图像大小不变
A_2 imfilter(A, h_2, same); % 应用5x5加权均值滤波器并保持图像大小不变
A_3 imfilter(A, h_3, same); % 应用7x7加权均值滤波器并保持图像大小不变% 显示原始图像和滤波后的图像 figure; % 创建一个新的图形窗口
subplot(2, 3, 2);imshow(A); % 显示原始图像A
title(原图像); % 设置子图的标题为“原图像”
subplot(2, 3, 4);imshow(A_1); % 显示3x3加权均值滤波后的图像A_1
title(3*3 加权均值滤波); % 设置子图的标题为“3*3 加权均值滤波”
subplot(2, 3, 5);imshow(A_2); % 显示5x5加权均值滤波后的图像A_2
title(5*5 加权均值滤波); % 设置子图的标题为“5*5 加权均值滤波”
subplot(2, 3, 6);imshow(A_3); % 显示7x7加权均值滤波后的图像A_3
title(7*7 加权均值滤波); % 设置子图的标题为“7*7 加权均值滤波”% 应用不同大小的均值滤波器到图像B
B_1 imfilter(B, p1); % 将3x3均值滤波器应用于图像B
B_2 imfilter(B, p2); % 将5x5均值滤波器应用于图像B
B_3 imfilter(B, p3); % 将7x7均值滤波器应用于图像B% 显示原始图像和滤波后的图像 figure; % 创建一个新的图形窗口
subplot(2, 3, 2); % 创建一个2行3列的子图布局并定位到第2个子图位置
imshow(B); % 显示图像B
title(原图像); % 设置子图的标题为“原图像”
subplot(2, 3, 4);imshow(B_1); % 显示3x3均值滤波后的图像B_1
title(3x3 均值滤波); % 设置子图的标题为“3x3 均值滤波”
subplot(2, 3, 5);imshow(B_2); % 显示5x5均值滤波后的图像B_2
title(5x5 均值滤波); % 设置子图的标题为“5x5 均值滤波”
subplot(2, 3, 6);imshow(B_3); % 显示7x7均值滤波后的图像B_3
title(7x7 均值滤波); % 设置子图的标题为“7x7 均值滤波”% 使用same选项保持输出图像大小与输入相同
B1 imfilter(B, h_1, same); % 应用3x3加权均值滤波器并保持图像大小不变
B2 imfilter(B, h_2, same); % 应用5x5加权均值滤波器并保持图像大小不变
B3 imfilter(B, h_3, same); % 应用7x7加权均值滤波器并保持图像大小不变% 显示原始图像和滤波后的图像 figure; % 创建一个新的图形窗口
subplot(2, 3, 2);imshow(B); % 显示原始图像B
title(原图像); % 设置子图的标题为“原图像”
subplot(2, 3, 4);imshow(B1); % 显示3x3加权均值滤波后的图像B1
title(3*3 加权均值滤波); % 设置子图的标题为“3*3 加权均值滤波”
subplot(2, 3, 5);imshow(B2); % 显示5x5加权均值滤波后的图像B2
title(5*5 加权均值滤波); % 设置子图的标题为“5*5 加权均值滤波”
subplot(2, 3, 6);imshow(B3); % 显示7x7加权均值滤波后的图像B3
title(7*7 加权均值滤波); % 设置子图的标题为“7*7 加权均值滤波% 调用自定义的均值滤波函数对图像B进行滤波
S_1 avg_filter(B,3); % 对图像B应用3x3均值滤波
S_2 avg_filter(B,7); % 对图像B应用7x7均值滤波
S_3 avg_filter(B,11); % 对图像B应用11x11均值滤波
S_4 javg_filter(B,3); % 对图像B应用3x3加权均值滤波
S_5 kavg_filter(B,5); % 对图像B应用5x5加权均值滤波
S_6 lavg_filter(B,7); % 对图像B应用7x7加权均值滤波
S_7 mid_filter(B,3); % 对图像B应用3x3中值滤波
S_8 mid_filter(B,5); % 对图像B应用5x5中值滤波
S_9 mid_filter(B,7); % 对图像B应用7x7中值滤波% 获取图像B的尺寸
[M,N] size(B);% 最大值滤波
for i 2:M-1for j2:N-1t B(i-1:i1,j-1:j1); % 提取以(i,j)为中心的3x3邻域F1(i,j) max(t(:)); % 将邻域内的最大值赋给F1的对应位置end
end
for i 3:M-2for j3:N-2t B(i-2:i2,j-2:j2);% 提取以(i,j)为中心的5x5邻域F2(i,j) max(t(:));% 将邻域内的最大值赋给F2的对应位置end
end
for i 4:M-3for j4:N-3t B(i-3:i3,j-3:j3); % 提取以(i,j)为中心的7x7邻域F3(i,j) max(t(:));% 将邻域内的最大值赋给F3的对应位置end
end
%最小值滤波
for i 2:M-1for j2:N-1t B(i-1:i1,j-1:j1);% 提取以(i,j)为中心的3x3邻域F4(i,j) min(t(:));% 将邻域内的最小值赋给F4的对应位置end
end
for i 3:M-2for j3:N-2t B(i-2:i2,j-2:j2);% 提取以(i,j)为中心的5x5邻域F5(i,j) min(t(:));% 将邻域内的最小值赋给F5的对应位置end
end
for i 4:M-3for j4:N-3t B(i-3:i3,j-3:j3);% 提取以(i,j)为中心的7x7邻域F6(i,j) min(t(:));% 将邻域内的最小值赋给F6的对应位置end
end
Figure subplot(2,3,2),imshow(B)
title(原图)
subplot(2,3,4),imshow(S_1)
title(均值滤波3*3)
subplot(2,3,5),imshow(S_2)
title(均值滤波7*7)
subplot(2,3,6),imshow(S_3)
title(均值滤波11*11)
Figure subplot(2,3,2),imshow(B)
title(原图)
subplot(2,3,4),imshow(S_4)
title(加权均值滤波3*3)
subplot(2,3,5),imshow(S_5)
title(加权均值滤波5*5)
subplot(2,3,6),imshow(S_6)
title(加权均值滤波7*7)
Figure subplot(2,3,2),imshow(B)
title(原图)
subplot(2,3,4),imshow(S_7)
title(中值滤波3*3)
subplot(2,3,5),imshow(S_8)
title(中值滤波5*5)
subplot(2,3,6),imshow(S_9)
title(中值滤波7*7)
Figure subplot(2,3,2),imshow(B)
title(原图)
subplot(2,3,4),imshow(F1)
title(最大值滤波3*3)
subplot(2,3,5),imshow(F2)
title(最大值滤波5*5)
subplot(2,3,6),imshow(F3)
title(最大值滤波7*7)
Figure subplot(2,3,2),imshow(B)
title(原图)
subplot(2,3,4),imshow(F4)
title(最小值滤波3*3)
subplot(2,3,5),imshow(F5)
title(最小值滤波5*5)
subplot(2,3,6),imshow(F6)
title(最小值滤波7*7)
底层编写版
function W avg_filter(x,n)
a(1:n,1:n)1; % 创建一个n×n的模板所有元素都是1
[hight, width]size(x); % 获取输入图像的高和宽变量名应为height和width这里可能是笔误
x1double(x);
x2x1;
for i1:hight-n1 for j1:width-n1 cx1(i:i(n-1),j:j(n-1)).*a; % 提取x1中从(i,j)开始的n×n区域并与模板相乘 ssum(sum(c)); % 计算c矩阵中所有元素的和 x2(i(n-1)/2,j(n-1)/2)s/(n*n); % 将计算得到的均值赋给模板中心位置的元素 end
end
% 未被赋值的元素边缘部分取原值
Wuint8(x2); % 将滤波后的图像转换回原始的数据类型并返回
end
function djavg_filter(x,n)
a[1,2,1;2,4,2;1,2,1]; %a即n×n模板,元素全是1
[hight, width]size(x); %输入图像是hightxwidth的,且hightn,widthn
x1double(x);
x2x1;
for i1:hight-n1 for j1:width-n1 cx1(i:i(n-1),j:j(n-1)).*a; %取出x1中从(i,j)开始的n行n列元素与模板相乘 ssum(sum(c)); %求c矩阵中各元素之和 x2(i(n-1)/2,j(n-1)/2)s/(n*n); %将与模板运算后的各元素的均值赋给模板中心位置的元素 end
end
%未被赋值的元素取原值 duint8(x2);
end
function dkavg_filter(x,n)
a[1,2,4,2,1;2,4,8,4,2;4,8,16,8,4;2,4,8,4,2;1,2,4,2,1]; %a即n×n模板,元素全是1
[hight, width]size(x); %输入图像是hightxwidth的,且hightn,widthn
x1double(x);
x2x1;
for i1:hight-n1 for j1:width-n1 cx1(i:i(n-1),j:j(n-1)).*a; %取出x1中从(i,j)开始的n行n列元素与模板相乘 ssum(sum(c)); %求c矩阵中各元素之和 x2(i(n-1)/2,j(n-1)/2)s/(n*n); %将与模板运算后的各元素的均值赋给模板中心位置的元素 end
end
%未被赋值的元素取原值 duint8(x2);
end
function dlavg_filter(x,n)
a[1,2,4,8,4,2,1; 2,4,8,16,8,4,2; 4,8,16,32,16,8,4; 8,16,32,64,32,16,8; 4,8,16,32,16,8,4; 2,4,8,16,8,4,2; 1,2,4,8,4,2,1]; %a即n×n模板,元素全是1
[hight, width]size(x); %输入图像是hightxwidth的,且hightn,widthn
x1double(x);
x2x1;
for i1:hight-n1 for j1:width-n1 cx1(i:i(n-1),j:j(n-1)).*a; %取出x1中从(i,j)开始的n行n列元素与模板相乘 ssum(sum(c)); %求c矩阵中各元素之和 x2(i(n-1)/2,j(n-1)/2)s/(n*n); %将与模板运算后的各元素的均值赋给模板中心位置的元素 end
end
%未被赋值的元素取原值 duint8(x2);
end
function dmid_filter(x,n)
[height, width]size(x); %输入图像是p×q的,且pn,qn
x1double(x);
x2x1;
for i1:height-n1 for j1:height-n1 cx1(i:i(n-1),j:j(n-1)); %取出x1中从(i,j)开始的n行n列元素,即模板(n×n的) ec(1,:); %是c矩阵的第一行 for u2:n e[e,c(u,:)]; %将c矩阵变为一个行矩阵 end mmmedian(e); %mm是中值 x2(i(n-1)/2,j(n-1)/2)mm; %将模板各元素的中值赋给模板中心位置的元素 end
end
%未被赋值的元素取原值
duint8(x2);
end调用历程
% 读取图像
A imread(1.png); % 读取名为1.png的图像% 应用均值滤波器
S_avg_3 avg_filter(A, 3); % 3x3 均值滤波
S_avg_5 avg_filter(A, 5); % 5x5 均值滤波
S_avg_7 avg_filter(A, 7); % 7x7 均值滤波% 应用加权均值滤波器
S_wavg_3 javg_filter(A, 3); % 3x3 加权均值滤波
S_wavg_5 kavg_filter(A, 5); % 5x5 加权均值滤波
S_wavg_7 lavg_filter(A, 7); % 7x7 加权均值滤波% 应用中值滤波器
S_mid_3 mid_filter(A, 3); % 3x3 中值滤波
S_mid_5 mid_filter(A, 5); % 5x5 中值滤波
S_mid_7 mid_filter(A, 7); % 7x7 中值滤波% 显示原始图像和滤波后的图像
figure; % 创建一个新的图形窗口
subplot(3, 3, 1); imshow(A); title(原图);% 显示均值滤波结果
subplot(3, 3, 2); imshow(S_avg_3); title(均值滤波 3x3);
subplot(3, 3, 3); imshow(S_avg_5); title(均值滤波 5x5);
subplot(3, 3, 4); imshow(S_avg_7); title(均值滤波 7x7);% 显示加权均值滤波结果
subplot(3, 3, 5); imshow(S_wavg_3); title(加权均值滤波 3x3);
subplot(3, 3, 6); imshow(S_wavg_5); title(加权均值滤波 5x5);
subplot(3, 3, 7); imshow(S_wavg_7); title(加权均值滤波 7x7);% 显示中值滤波结果
subplot(3, 3, 8); imshow(S_mid_3); title(中值滤波 3x3);
subplot(3, 3, 9); imshow(S_mid_5); title(中值滤波 5x5);
function W avg_filter(x, n)% 创建一个n×n的模板所有元素都是1a ones(n) * ones(n, 1); % 正确的创建n×n模板的方式[h, w] size(x); % 获取输入图像的高和宽x1 double(x); % 将图像转换为双精度浮点数x2 x1; % 创建一个与原图像同样大小的副本for i 1:(h - n 1)for j 1:(w - n 1)% 提取x1中从(i,j)开始的n×n区域并与模板相乘c x1(i:in-1, j:jn-1) .* a; s sum(c(:)); % 计算c矩阵中所有元素的和% 将计算得到的均值赋给模板中心位置的元素x2(i(n-1)/2, j(n-1)/2) s / (n * n); endendW uint8(x2); % 将滤波后的图像转换回原始的数据类型
end
% 加权均值滤波函数3x3
function d javg_filter(x, n)a [1, 2, 1; 2, 4, 2; 1, 2, 1]; % 创建一个3x3的加权模板[h, w] size(x); % 获取输入图像的高和宽d double(x); % 将图像转换为双精度浮点数for i 1:h-n1for j 1:w-n1c d(i:in-1, j:jn-1) .* a; % 提取d中从(i,j)开始的n×n区域并与模板相乘s sum(sum(c)); % 计算c矩阵中所有元素的和d(i(n-1)/2, j(n-1)/2) s / (n*n); % 将计算得到的加权均值赋给模板中心位置的元素endendd uint8(d); % 将滤波后的图像转换回原始的数据类型
end% 加权均值滤波函数5x5
function d kavg_filter(x, n)a [1, 2, 4, 2, 1; 2, 4, 8, 4, 2; 4, 8, 16, 8, 4; 2, 4, 8, 4, 2; 1, 2, 4, 2, 1]; % 创建一个5x5的加权模板[h, w] size(x); % 获取输入图像的高和宽d double(x); % 将图像转换为双精度浮点数for i 1:h-n1for j 1:w-n1c d(i:in-1, j:jn-1) .* a; % 提取d中从(i,j)开始的n×n区域并与模板相乘s sum(sum(c)); % 计算c矩阵中所有元素的和d(i(n-1)/2, j(n-1)/2) s / (n*n); % 将计算得到的加权均值赋给模板中心位置的元素endendd uint8(d); % 将滤波后的图像转换回原始的数据类型
end% 加权均值滤波函数7x7
function d lavg_filter(x, n)a [1, 2, 4, 8, 4, 2, 1; 2, 4, 8, 16, 8, 4, 2; 4, 8, 16, 32, 16, 8, 4; 8, 16, 32, 64, 32, 16, 8; 4, 8, 16, 32, 16, 8, 4; 2, 4, 8, 16, 8, 4, 2; 1, 2, 4, 8, 4, 2, 1]; % 创建一个7x7的加权模板[h, w] size(x); % 获取输入图像的高和宽d double(x); % 将图像转换为双精度浮点数for i 1:h-n1for j 1:w-n1c d(i:in-1, j:jn-1) .* a; % 提取d中从(i,j)开始的n×n区域并与模板相乘s sum(sum(c)); % 计算c矩阵中所有元素的和d(i(n-1)/2, j(n-1)/2) s / (n*n); % 将计算得到的加权均值赋给模板中心位置的元素endendd uint8(d); % 将滤波后的图像转换回原始的数据类型
end% 中值滤波函数
function d mid_filter(x, n)[h, w] size(x); % 获取输入图像的高和宽d double(x); % 将图像转换为双精度浮点数for i 1:h-n1for j 1:w-n1c d(i:in-1, j:jn-1); % 提取d中从(i,j)开始的n×n区域e reshape(c, [], 1); % 将c矩阵变为一个列向量mm median(e); % 计算列向量的中值d(i(n-1)/2, j(n-1)/2) mm; % 将中值赋给模板中心位置的元素endendd uint8(d); % 将滤波后的图像转换回原始的数据类型
end
结果如下图所示
五、结语和总结 uu们我们的实验内容到这里就基本上结束对于第五章内容的学习了但是正如文章开头所述理论学习更加重要所以有关于滤波知识的学习我们一定要巩固和理解数字图像处理实际上是我们对于美的追求的一种体现所以让我们每天学习和进步加油uu们 后续我会开展所有系列的理论课程的讲述因为没有那么多时间看书所以咸鱼哥会让知识点和细节都更加便于理解和学习的方法所以请耐心一下咸鱼哥觉得学习知识是一个共享的过程而分享是种快乐所以加油哦 ヽ(ω(ω〃)ゝ咸鱼哥寄语