学习目标: 图像处理经典案例 去除噪声
1.简述
图像降噪的英文名称是Image Denoising, 图像处理中的专业术语。是指减少数字图像中噪声的过程,有时候又称为图像去噪。图像的噪声来源相对复杂,搞清楚图像噪声的成因对我们进行图像去噪的工作有帮助。因为对于满足某些数学统计规律的噪声,那么逆向去除的时候就变得好办了。另外,深度学习技术很多也用在图像去噪领域,深度学习依赖数据,明白噪声的分布特点有利于制作数据集。
还有需要明确的是,对于图像噪声而言,本质并非是空域的,也就是说并不是该点相对于周边点显得突兀,就说该点是噪点。而是该点相对于连续时间内同一位置产生的不同点而言,如果误差较大,才能称之为噪点,即噪声本质是时域的。 那么,我们在计算图像某块区域的时候,有时候会用这块区域的平坦图像计算该区域的信噪比,其实也是用了一个潜在的假设:该平坦区域的各个点可以看做是中心点的连续时间内的集合。
噪声是图像干扰的重要原因。一幅图像在实际应用中可能存在各种各样的噪声,这些噪声可能在传输中产生,也可能在量化等处理中产生。根据噪声和信号的关系可将其分为三种形式:(f(x, y)表示给定原始图像,g(x, y)表示图像信号,n(x, y)表示噪声。)
1) 加性噪声,此类噪声与输入图像信号无关,含噪图像可表示为f(x, y)=g(x, y)+n(x, y),信道噪声及光导摄像管的摄像机扫描图像时产生的噪声就属这类噪声;
2) 乘性噪声,此类噪声与图像信号有关,含噪图像可表示为f(x, y)=g(x, y)+n(x ,y)g(x, y),飞点扫描器扫描图像时的噪声,电视图像中的相干噪声,胶片中的颗粒噪声就属于此类噪声。
3) 量化噪声,此类噪声与输入图像信号无关,是量化过程存在量化误差,再反映到接收端而产生。
目前来说图像去噪分为三大类:基于滤波器的方法(Filtering-Based Methods)、基于模型的方法(Model-Based Methods)和基于学习的方法(Learning-Based Methods)。
上面是一种划分形式,下面让我们看一下另外一种划分方式,按照 sensor 成像过程划分:
shot noise
: 光子打在光敏传感器上经过光电效应产生电子,但是电子的产生是具有误差的。对于同一强度的光子,产生的电子大小的分布满足迫松分布的统计。这个误差带来的噪声称之为散粒噪声,即 shot noise。read noise
:电子转换成电压,电压经模数转换器后读出具体数值,在读数的过程中产生的误差可以称之为读出噪声,即 read noise。我认为 read noise 广义来说包含了两块,一块是黑电平(暗电流),另一块则是满足高斯分布的噪声。- 其他:这里简单的把其他噪声归结为一类,因为这类噪声基本上不满足统计规律,包括热噪声(传感器发热的产生的电子)、像素响应不均匀性(像素点对于光子响应的不均匀性)、量化噪声(读出电压为浮点型,需要转化为整型)、sensor 的固定噪声(与 sensor 的工艺相关)等等。
2.代码
%%
close all;
clear all;
I=imread('cameraman.tif');
I=im2double(I);
%% 生成正弦噪声
u=32;
v=-32;
d=0.3;
u1=2*pi*u/256;
v1=2*pi*v/256;
for j=1:256
for k=1:256
A(j,k)=d*sin(u1*j+v1*k);
end
end
%% 叠加生成正弦噪声
J=I+A;
F1=fft2(I);
F1am=abs(F1);
F1ph=angle(F1);
F11=fftshift(F1);
F11am=abs(F11);
F2=fft2(J);
F2am=abs(F2);
F2ph=angle(F2);
F22=fftshift(F2);
F22am=abs(F22);
subplot(2,3,1),imshow(I);title('原图像');
subplot(2,3,2),imshow(J);title('叠加正弦噪声后的图像');
subplot(2,3,4),imshow(0.25*log10(1+F11am));
subplot(2,3,5),imshow(0.25*log10(1+F22am));
%% 交互式复原图像
F2am0=F2am(1,1);
F2am(1,1)=0;
thresh=max(F2am(:));
for j=1:1:256
for k=1:1:256
if F2am(j,k)>thresh/2
F2am(j,k)=0;
end
end
end
F2am(1,1)=F2am0;
R=F2am.*exp(i*F2ph);
R2=fftshift(R);
R2am=abs(R2);
subplot(2,3,3),imshow(abs(ifft2(R)));title('复原后的图像')
subplot(2,3,6),imshow(0.25*log10(1+R2am));
F3am=abs(fftshift(fft2(J)));
figure;
imshow(0.25*log10(1+F3am));
3.运行结果