3.图像滤波处理。自选一张图片,完成以下图像处理:①给图像分别添加随机噪声和椒盐噪声;②采用不同的平滑滤波模板进行滤波对比(不同模板、不同尺寸);③采用中值滤波对图像进行滤波对比;④对添加随机噪声的多幅图片取平均。重点对比分析:不同空间域卷积器模板的滤波效果有何不同?空间域卷积器模板的大小的滤波效果有何影响?
图像平滑处理的基本方法:
图像在获取、传输过程中, 受干扰的影响, 会产生噪声. 噪声是一种错误的信号, 干扰正常信号, 造成图像毛糙. 这时就需要对图像进行平滑处理.
图像去噪是一种信号滤波的方法, 目的是保留有用信号, 去除噪音信号.
图像噪声:
噪声干扰一般是随机产生的, 分布不规律, 大小也不规则. 噪声像素的灰度是空间不相关的, 与邻近像素显著不同.
平滑处理的目的:
平滑滤波使图像的低频分量增强, 同时削弱高频分量, 用于消除图像中的随机噪声, 起到平滑作用.
图像增强:
·空间域法: 在原图像上直接对像素的灰度值进行处理. 分为两类, 点运算和局部运算(邻域有关的空间域运算).
·频域法: 在图像的变换域上进行处理, 增强感兴趣的频率分量, 然后进行反变换, 得到增强后的图像.
空间域滤波增强技术:
图像平滑处理技术:
邻域处理方法: 用某一模板对每个像元与其周围邻域的所有像元进行某种数学运算, 得到该像元新的灰度值. 新的灰度值不仅与该像元的灰度值有关, 还与其邻域内像元的灰度值有关.
邻域处理——模板:
平滑处理的基本方法:
·线性平滑: 对于每一个像素的灰度值用它的邻域值代替, 邻域为N×M, N取奇数.
·非线性平滑: 改进, 取一个阈值, 当像素值与其邻域平均值之间的差大于阈值时, 以均值代替; 反之取其本身值.
·自适应平滑: 物体边缘在不同的方向上有不同的统计特性, 即不同的均值和方差, 为保留一定的边缘信息, 采用自适应法.
空域卷积滤波: 空域卷积滤波借助模板操作.
模板操作:
模板操作是数字图像处理中常用的一种运算方式. 图像的平滑、锐化以及后面将要讨论的细化、边缘检测等都要用到模板操作.
模板:
· 模板: 所有系数都是正数. 也叫滤波器、掩模、核或窗, 与邻域具有相同维数.
·邻域平均模板所有系数均为1.
· 星号表示为中心元素, 将要处理的元素. 将原图中一个像素的灰度值和相邻近的8个像素值相加, 平均值作为中心值.
卷积运算:
· 领域中的每个像素分别与卷积核中的每一个元素相乘, 求和的结果即为中心像素的新值.
· 卷积核中的元素称作加权系数(卷积系数), 系数的大小及排列顺序, 决定了处理的类型. 改变加权系数与符号, 影响新值.
模板操作:
· 邻域运算: 某个像素点的结果不仅和本像素灰度有关, 而且和其邻域点的值有关.
边界问题的解决:
卷积步骤:
·将模板在图中漫游, 并将模板中心与图中某个像素位置重合;
·将模板上系数与模板下对应像素相乘;
·将所有乘积相加;
·将和赋值给图中对应模板中心位置的像素.
3.1 给数字图像添加Gaussian Noise (高斯噪声)和Salt and Pepper Noise (椒盐噪声)
%给图像添加高斯噪声和椒盐噪声
I = imread('Durant.png');
I_gray = rgb2gray(I);
%加入Gaussian noise
I_gray1 = imnoise(I_gray, 'Gaussian', 0, 0.01);
%加入salt and pepper noise
%椒盐噪声也称为脉冲噪声, 是图像中常见的一种噪声.
%它是一种随机出现的白点或者黑点.
I_gray2 = imnoise(I_gray, 'Salt & Pepper', 0.01);
%
subplot(1, 3, 1);
imshow(I_gray);
title('原图的灰度图像');
%
subplot(1, 3, 2);
imshow(I_gray1);
title('加入Gaussian noise');
%
subplot(1, 3, 3);
imshow(I_gray2);
title('加入Salt & Pepper noise');
3.2 邻域平均法为图像降噪
3.2.1 含Gaussian Noise的图像
%给图片加入高斯噪声, 然后使用邻域平均法降噪
I = imread('Durant.png');
I_gray = rgb2gray(I);
%加入Gaussian Noise
I_gray1 = imnoise(I_gray, 'Gaussian', 0, 0.01);
%模板为3×3, 平滑滤波
image = filter2(fspecial('average', 3), I_gray1) / 255;
%
subplot(1, 3, 1);
imshow(I_gray);
title('原图的灰度图像');
%
subplot(1, 3, 2);
imshow(I_gray1);
title('加入高斯噪声的灰度图像');
%
subplot(1, 3, 3);
imshow(image);
title('3×3模板平滑滤波后的灰度图像');
3.2.2 含Salt and Pepper Noise的图像
%给图片加入椒盐噪声, 然后使用邻域平均法降噪
I = imread('Durant.png');
I_gray = rgb2gray(I);
%加入Gaussian Noise
I_gray1 = imnoise(I_gray, 'Salt & Pepper', 0.01);
%模板为3×3, 平滑滤波
image = filter2(fspecial('average', 3), I_gray1) / 255;
%
subplot(1, 3, 1);
imshow(I_gray);
title('原图的灰度图像');
%
subplot(1, 3, 2);
imshow(I_gray1);
title('加入高斯噪声的灰度图像');
%
subplot(1, 3, 3);
imshow(image);
title('3×3模板平滑滤波后的灰度图像');
中值滤波法:
· 邻域平均法: 属于低通滤波的处理方法, 它在抑制噪声的同时使图像变得模糊. 即图像的细节(例如边缘信息)被削弱.
中值滤波的性质:
· 中值滤波器不影响阶跃函数和斜坡函数. 周期小于窗口长度一半的脉冲受到抑制, 另外三角函数的顶部变平.
窗口的选择:
中值滤波主要特性:
3.3 数字图像的中值滤波法
3.3.1 含Salt and Pepper Noise的图像
%给图片加入椒盐噪声, 然后使用中值滤波法降噪
I = imread('Durant.png');
I_gray = rgb2gray(I);
%加入salt and pepper noise
I_gray1 = imnoise(I_gray, 'Salt & Pepper', 0.01);
%中值滤波是一种非线性数字滤波器技术, 用于降噪.
%medfilter2(image, [n, n]):
%image: 需要过滤的图像
%[n, n]: 模板大小为n×n
%medfilter2为二维中值滤波函数, 使用前须将图像灰度化.
image = medfilt2(I_gray1, [3, 3]);
%
subplot(1, 3, 1);
imshow(I_gray);
title('原图的灰度图像');
%
subplot(1, 3, 2);
imshow(I_gray1);
title('加入椒盐噪声的灰度图像');
%
subplot(1, 3, 3);
imshow(image);
title('3×3模板中值滤波后的灰度图像');
3.3.2 含Gaussian Noise的图像
%给图片加入高斯噪声, 然后使用中值滤波法降噪
I = imread('Durant.png');
I_gray = rgb2gray(I);
%加入salt and pepper noise
I_gray1 = imnoise(I_gray, 'Gaussian', 0, 0.01);
%中值滤波是一种非线性数字滤波器技术, 用于降噪.
%medfilter2(image, [n, n]):
%image: 需要过滤的图像
%[n, n]: 模板大小为n×n
%medfilter2为二维中值滤波函数, 使用前须将图像灰度化.
image = medfilt2(I_gray1, [3, 3]);
%
subplot(1, 3, 1);
imshow(I_gray);
title('原图的灰度图像');
%
subplot(1, 3, 2);
imshow(I_gray1);
title('加入高斯噪声的灰度图像');
%
subplot(1, 3, 3);
imshow(image);
title('3×3模板中值滤波后的灰度图像');
3.4 对多幅含Gaussian Noise的图像取平均(降噪)
3.4.1 5幅图片取平均
%对多幅添加高斯噪声的图片取平均
I = imread('Durant.png');
I_gray = rgb2gray(I);
%对原图的灰度图像I_gray分别添加5次Gauss噪声.
%Gaussian noise: EX = 0,
temp1 = imnoise(I_gray, 'Gaussian', 0, 0.01);
temp2 = imnoise(I_gray, 'Gaussian', 0, 0.01);
temp3 = imnoise(I_gray, 'Gaussian', 0, 0.01);
temp4 = imnoise(I_gray, 'Gaussian', 0, 0.01);
temp5 = imnoise(I_gray, 'Gaussian', 0, 0.01);
%先将temp1, ..., temp5矩阵转换为double类型,
%这样temp1, ..., temp5相加后, 求和结果数值不会失真.
G = double(temp1) + double(temp2) + double(temp3) + double(temp4) + double(temp5);
%将矩阵G中的数据除以5, 相当于5幅图片取平均.
G = G / 5;
%将矩阵G的元素转换为uint8类型.
G = uint8(G);
%显示原图的灰度图像.
subplot(1, 2, 1);
imshow(I_gray);
title('原图的灰度图像');
%显示取平均后的图片.
subplot(1, 2, 2);
imshow(G);
title('5幅含噪图片取平均');
3.4.2 10幅图片取平均
%对多幅添加高斯噪声的图片取平均
I = imread('Durant.png');
I_gray = rgb2gray(I);
%获取图片矩阵的行数和列数, 创建一个height×width的零矩阵G.
[height, width, channels] = size(I_gray);
G = zeros(height, width);
%对原图的灰度图像I_gray分别添加5次Gauss噪声.
for i = 1 : 10
G = G + double(imnoise(I_gray, 'Gaussian', 0, 0.01));
end
%将矩阵G中的数据除以10, 相当于10幅图片取平均.
G = G / 10;
%将矩阵G的元素转换为uint8类型.
G = uint8(G);
%显示原图的灰度图像.
subplot(1, 2, 1);
imshow(I_gray);
title('原图的灰度图像');
%显示取平均后的图片.
subplot(1, 2, 2);
imshow(G);
title('10幅含噪图片取平均');