0%

数字图像处理实验报告

Problem-1

实验分析

本实验主要实现对图像的自适应滤波,滤波函数为

$g(x,y)=f(x,y)-\frac{5000}{\sigma_{f(x,y)^2} }(f(x,y)-m(x,y))$

其中,

$$m(x,y)=\frac19\sum_{i=-1}^1{\sum_{j=-1}^1{f(x+i, y+j)}}$$

$$\sigma_{f(x,y)^2}=\frac19\sum_{i=-1}^1{\sum_{j=-1}^1}{(f(x+i,y+j)-m(x,y))^2}$$

由公式可知,m(x,y)和$\sigma_{f(x,y)^2}$是对于点(x,y)的3×3邻域求均值和方差,于是可以直接使用MATLAB中的mean函数和var函数进行代替,直接进行运算。
高斯滤波,通过加权平均后,图像变的模糊,噪点有所减少,但是图像损失了大量细节;中值滤波,对于本实验所产生的椒盐噪声应该有较好的处理,但是实际上,图片的涂抹很严重,损失了大量的信息;自适应滤波,对噪点消除的不是很理想,但是保留了图片本身影响最小。我认为自适应滤波应该是本实验中还原效果最好的滤波器。
同时发现,程序的运行速度特别慢,大约要14秒,使用MATLAB中的计时运行后发现,主要的时间集中在mean函数上,对于500×350的图像,mean函数共调用了350000次。为优化时间,将mean函数改成求和并除以9,运行速度提升明显,只需要2.3秒左右。

Read image and Add noise

噪声产生公式
$$f(x,y)=\begin{cases}
255 & & {f_0(x, y) > t_1(fx, y)} \\
0 & & {f_0(x, y) < t_1(fx, y)} \\
f_0(x, y) & & {otherwise}\end{cases}$$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
origin=imread('lena.jpg');
origin=rgb2gray(origin);
[m,n]=size(origin);
t1 = round(255 * rand(m, n));
t2 = round(255 * rand(m, n));
origin2=origin;
for i=1:m
for j=1:n
if origin2(i,j)&gt;t1(i,j)
origin(i,j)=255;
else if origin2(i,j)&lt;t2(i,j)
origin(i,j)=0;
end
end
end
end
figure(1);
imshow(origin);

Gaussian filter

3x3的高斯滤波器

1
2
3
4
gaussian=fspecial('gaussian',[3,3],1);
g1=imfilter(origin,gaussian,'conv','symmetric');
figure(2);
imshow(g1);

Median filter

3x3的中值滤波器

1
2
3
g2=medfilt2(origin,[3,3]);
figure(3);
imshow(g2);

Adaptive filter

$$g(x,y)=f(x,y)-\frac{5000}{\sigma^2_{f(x,y)}}(f(x,y)-m(x,y))$$

其中,

$$m(x,y)=\frac19\sum\limits_{i=-1}^1\sum\limits_{j=-1}^1f(x+i,y+j)$$

$$\sigma^2_{f(x,y)}=\frac19\sum\limits_{i=-1}^1\sum\limits_{j=-1}^1(f(x+i,y+j)-m(x,y))^2$$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
extendim = zeros(m+2,n+2);
extendim(2:m+1,2:n+1) = origin(:,:,1);
extendim(1,2:n+1) = origin(1,:,1);
extendim(m+2,2:n+1) = origin(m,:,1);
extendim(2:m+1,1) = origin(:,1,1);
extendim(2:m+1,n+2) = origin(:,n,1);
g4 = uint8(zeros(m, n));
one = ones(3, 3);
for x = 1 : m
for y = 1 : n
temp = extendim(x:x + 2, y: y + 2);
% avg_1 = mean(mean(temp)); %相当于m(x,y)
% d2_1 = var(temp(:), 1); %想到与sigma_squared(x,y)
% g4_1(x, y) = extendim(x + 1, y + 1) - (5000 / d2_1) * (extendim(x + 1, y + 1) - avg_1);
avg = sum(sum(temp))/9;
d2 = (temp - avg * one).^2;
d2 = sum(sum(d2))/9;
g4(x, y) = extendim(x + 1, y + 1) - (5000 / d2) * (extendim(x + 1, y + 1) - avg);
end
end
figure(4);
imshow(g4);

Problem-2

Matlab中imfilter函数的基本原理和数学公式

函数原型

1
G = imfilter(F, W, filtering_mode, boundary_options, size_options)

其中G为输出图像,F为原图像,W为滤波器,filtering_mode用于指定在滤波过程中是使用“相关”还是“卷积”。boundary_options用于处理边界充零问题,边界的大小由滤波器的大小确定。具体参数选项见下表:

参数 选项 描述
filtering_mode ‘corr’ 通过使用相关来完成,该值为默认。
‘conv’ 通过使用卷积来完成
boundary_options ‘X’ 输入图像的边界通过用值X(无引号)来填充扩展,其默认值为0
‘replicate’ 图像大小通过复制外边界的值来扩展
‘symmetric’ 图像大小通过镜像反射其边界来扩展
‘circular’ >图像大小通过将图像看成是一个二维周期函数的一个周期来扩展
size_options ‘full’ 输出图像的大小与被扩展图像的大小相同
‘same’ 输出图像的大小与输入图像的大小相同。这可通过将滤波掩模的中心点的偏移限制到原图像中包含的点来实现,该值为默认值。

函数imfilter的一半过程为:

  1. 根据选项对图片进行边缘扩充,得到中间图像T
  2. 根据选项,对中间图像T和滤波器W进行卷积操作或者相关操作
  3. 根据选项,对中间图像T做调整并输出

其中,
卷积操作的数学公式为:$G=F*W$,
展开后为:
$$G(x,y)=\sum_{i=-k}^k\sum_{j=-k}^k{f(x-i,y-j)⋅W(i,j)}$$

其中,2k+1为滤波器W的宽度或高度。
相关操作数学公式:
$$G=F∙W$$,
展开后为:
$$G(x,y)=\sum_{i=-k}^k\sum_{j=-k}^k{f(i-x,y-j)⋅W(i,j)}$$

其中,2k+1为滤波器W的宽度或高度。

Which of the three sharpening procedures is visually more appealing to you? Why?

现象:

  • 单纯使用+8的拉普拉斯滤波器,图像的边缘非常明显,但是图片中存在大量的噪点。
  • 通过高斯滤波后,图像的噪点减少,但是边缘也变的模糊。
  • -8的拉普拉斯滤波器效果比-4的滤波器效果要好,噪点较少,图像边缘较明显。

原因:
使用高斯滤波对图像进行平滑处理,使图像中的颜色变化剧烈的部分变平滑,因此在边缘检测的时候,图像整体的噪点下降,同时,-8的滤波器对于边缘的增强效果要好于-4.

Read image and Define filter

  • filterlap1 中心+8的拉普拉斯滤波器
  • filterlap2 中心-4的拉普拉斯滤波器
  • filterlap3 中心-8的拉普拉斯滤波器
1
2
3
4
5
im = imread('Lena.jpg');
im=rgb2gray(im);
filterlap1 = [-1,-1,-1;-1,8,-1;-1,-1,-1];
filterlap2 = [0,1,0;1,-4,1;0,1,0];
filterlap3 = [1,1,1;1,-8,1;1,1,1];

Image sharpening using the 3x3 Laplacian filter with +8 at the center.

1
2
3
im1=imfilter(im,filterlap1,'conv','symmetric');
figure(1);
imshow(im1);

The input image is first smoothed with the 3x3 ,σ=5 Gaussian filter. The resulting image is then sharpened using the Laplacian filter with -4 at the center.

1
2
3
4
5
gaussian1 = fspecial('gaussian',[3,3],sqrt(5));
im2=imfilter(im,gaussian1,'conv','symmetric'); %高斯滤波
im2=imfilter(im2,filterlap2,'conv','symmetric'); %拉普拉斯滤波
figure(2);
imshow(im2);

The input image is first smoothed with the 3x3 , σ=1 Gaussian filter. The resulting image is then sharpened using the Laplacian filter with -8 at the center.

1
2
3
4
5
gaussian2 = fspecial('gaussian', [3, 3], 1);
im3 = imfilter(im, gaussian2, 'conv', 'symmetric'); %高斯滤波
im3 = imfilter(im3, filterlap3, 'conv', 'symmetric'); %拉普拉斯滤波
figure(3);
imshow(im3);