在图像的采集、传送和转换过程中,会加入一些噪声,表现为图像模糊、失真、有噪声等。在实际应用中需要清晰的、高质量的图像。图像复原就是要尽可能恢复退化图像的本来面目,它是沿图像退化的逆过程进行处理。
典型的图像复原技术是根据图像退化的先验知识建立一个退化模型,以此模型为基础,采用各种逆退化处理方法进行恢复,得到质量改善的图像。
故将详细的介绍图像复原技术,主要包括图像的噪声模型、图像的滤波以及常用的图像复原方法等。
图像复原在数字图像处理中有非常重要的研究意义。图像复原最基本的任务是在去除图像中的噪声的同时,不丢失图像中的细节信息。然而抑制噪声和保持细节往往是一对矛盾,也是图像处理中至今尚未很好解决的一个问题。图像复原的目的就是为了抑制噪声,改善图像的质量。
图像复原和图像增强都是为了改善图像的质量,但是两者是有区别的。区别在于:
- 图像增强不考虑图像是如何退化的,而是试图采用各种技术来增强图像的视觉效果
- 图像复原需要知道图像退化的机制和过程等先验知识,据此找到一种相应的逆处理方法,从而得到恢复的图像
图像噪声模型
数字图像的噪声主要来自图像的采集和传输过程。图像传感器的工作受到各种因素的影响。例如在使用CCD摄像机获取图像时,光照强度和传感器的温度是产生噪声的主要原因。图像在传输过程中也会受到噪声的干扰。
图像噪声按照噪声和信号之间的关系可以分为加性噪声和乘性噪声两种。噪声是不可预测的,只能用概率统计方法来认识的随机误差。
下面介绍常见的噪声:
1、高斯噪声
2、椒盐噪声
3、均匀分布噪声
4、指数分布噪声
5、伽玛分布噪声
在MATLAB中,可以通过函数imnoise( )给图像添加噪声,该函数可以得到高斯分布噪声、椒盐噪声、泊松分布噪声和乘性噪声。该函数的调用格式为:
J=imnoise(I, type, parameters)
该函数对图像I添加类型为type的噪声,type对应的噪声类型如下:
matlab语言 | 名称 |
---|---|
‘gaussian’ | 高斯噪声 |
‘localvar’ | 0均值白噪声 |
‘poisson’ | 泊松噪声 |
‘salt & pepper’ | 椒盐噪声 |
‘speckle’ | 乘性噪声 |
参数parameters为对应噪声的参数,如果不设置parameters则采用系统的默认值。
高斯噪声
I = imread('lena_color_512.tif');
I = rgb2gray(I);
J = imnoise(I, 'gaussian', 0, 0.01); %添加均值为0,方差为0.01的高斯噪声
K = imnoise(I, 'gaussian', 0, 0.03); %添加均值为0,方差为0.03的高斯噪声
figure;
subplot(121), imshow(J);
subplot(122), imshow(K);
椒盐噪声
I = imread('lena_color_512.tif');
I = rgb2gray(I);
J = imnoise(I, 'salt & pepper', 0.01); %添加密度为0.01的椒盐噪声
K = imnoise(I, 'salt & pepper', 0.03); %添加密度为0.03的椒盐噪声
figure;
subplot(121), imshow(J);
subplot(122), imshow(K);
下面来分别得到椒噪声和盐噪声
I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);
R = rand(size(I));
J = I;
J(R <= 0.2) = 0;
K = I;
K(R<=0.03) = 1;
figure;
subplot(121), imshow(J);
subplot(122), imshow(K);
左边黑色的噪声就是椒噪声,右边白色的就是盐噪声
泊松噪声
I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);
J = imnoise(I, 'poisson');
figure;
subplot(121), imshow(I);
subplot(122), imshow(J);
似乎没有多大的效果dbq
乘性噪声
I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);
J = imnoise(I, 'speckle');
K = imnoise(I, 'speckle', 0.2);
figure;
subplot(121), imshow(J);
subplot(122), imshow(K);
左侧为默认的乘性噪声0.04,右侧为自定义噪声0.2
均匀噪声
m = 256; n =256;
a = 50; b = 180;
I = a+(b-a)*rand(m,n);
figure;
subplot(121), imshow(uint8(I));
subplot(122), imhist(uint8(I));
左图为自定义的均匀噪声,右侧为其直方图,可以知道大致在一条水平线
滤波方式
均值滤波
I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);
I = imnoise(I, 'gaussian', 0.05);
PSF = fspecial('average', 3); %算术均值
J = imfilter(I, PSF);
K = exp(imfilter(log(I), PSF)); %几何均值
figure;
subplot(131), imshow(I);
subplot(132), imshow(J);
subplot(133), imshow(K);
顺序统计滤波
包括中值滤波,最大值滤波,最小值滤波,其中中值滤波最适宜去除椒盐噪声,能很好保留图像边缘,而最大值滤波虽也能去除椒盐噪声,但会从黑色物体的边缘去除一些黑色像素,同样最小值滤波会将白色物体的边缘去除一些白色像素
- 中值滤波
I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);
I = imnoise(I, 'salt & pepper', 0.05);
J = medfilt2(I, [3, 3]);
figure;
subplot(121), imshow(I);
subplot(122), imshow(J);
- 最大值和最小值滤波
I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);
I = imnoise(I, 'salt & pepper', 0.1);
domain = [0 1 1 0; 1 1 1 1; 1 1 1 1; 0 1 1 0]; %构造函数
J = ordfilt2(I, 6, domain); %进行顺序统计滤波,选取第6个像素输出
figure;
subplot(121), imshow(I);
subplot(122), imshow(J);
I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);
I = imnoise(I, 'salt & pepper', 0.05);
J = ordfilt2(I, 1, ones(4,4)); %进行顺序统计滤波,选取最大值输出,构造4*4模板
K = ordfilt2(I, 9, ones(3)); %进行顺序统计滤波,选取最小值输出,构造3*3模板
figure;
subplot(131), imshow(I);
subplot(132), imshow(J);
subplot(133), imshow(K);
下图为加了椒盐噪声,最大值滤波,最小值滤波的结果
自适应滤波
在MATLAB软件中,函数wiener2( )可以根据图像中的噪声进行自适应维纳滤波,还可以对噪声进行估计。该函数根据图像的局部方差来调整滤波器的输出。
该函数的调用格式为:
J = wiener2(I, [m, n], noise)
%该函数对图像I进行自适应维纳滤波,采用的窗口大小为mXn,如果不指定窗口大小,默认值为3X3。输入参数noise为噪声的能量。返回值J为滤波后得到的图像。
[J, noise] = wiener2(I, [m, n])
%该函数对图像中的噪声进行估计,返回值noise为噪声的能量。
举个例子
I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = imcrop(I, [100, 100, 1024, 1024]); %获取图像的一部分
J = imnoise(I, 'gaussian', 0, 0.03);
[K , noise] = wiener2(J, [5, 5]);
figure;
subplot(131), imshow(I);
subplot(132), imshow(J);
subplot(133), imshow(K);
下图结果为原图,加高斯噪声,维纳滤波
图像复原方法
主要包括逆滤波复原、维纳滤波复原、约束最小二乘法复原、 Lucy-Richardson复原和盲解卷积复原等。
逆滤波复原
表示输入图像, 即理想的、没有退化的图像, 是退化后观察得到的图像,为加性噪声。
图像复原的目的是给定和退化函数,以及关于加性噪声的相关知识,得到原图像的估计图像,使该图像尽可能的逼近原图像。然后通过的傅立叶反变换得到图像的估计值,称为逆滤波。
逆滤波是一种非约束复原方法。非约束复原是指在已知退化图像的情况下,根据对退化模型和噪声的一些知识,做出对原图像的估计,使得某种事先确定的误差准则为最小。在得到误差最小的解的过程中,没有任何约束条件。
clear all ;
close all;
I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);
[m, n] = size(I);
M = 2*m; n = 2*n;
u = -m/2 : m/2-1;
v = -n/2 : n/2-1;
[U, V] = meshgrid(u, v);
D = sqrt(U.^2 + V.^2);
D0 = 130;
H = exp(-(D.^2)./(2*(D0^2)));
N = 0.01* ones(size(I, 1), size(I, 2));
N = imnoise(N, 'gaussian', 0, 0.01);
J = fftfilter(I, H) + N;
figure;
subplot(121), imshow(I);
subplot(122), imshow(J, []);
HC = zeros(m,n);
M1 = H>0.1;
HC(M1) = 1./H(M1);
K = fftfilter(J, HC);
HC = zeros(m, n);
M2 = H>0.01;
HC(M2) = 1./H(M2);
L = fftfilter(J, HC);
figure;
subplot(121), imshow(K, [ ]);
subplot(122), imshow(L, [ ]);
调用了函数fftfilter()
function Z = fftfilter(X, H)
F = fftshift(fft2(X, size(H, 1), size(H, 2)));
Z = H.*F;
Z = ifftshift(Z);
Z = abs(ifft2(Z));
Z = Z(1: size(X,1), 1: size(X,2));
end
维纳滤波复原
维纳(wiener) 滤波最早是由Wiener首先提出的,并应用于一维信号,取得很好的效果。后来该算法又被引入二维信号处理,也取得相当满意的效果,尤其是在图像复原领域。由于维纳滤波器的复原效果好,计算量较低,并且抗噪性能优良,因而在图像复原领域得到了广泛的应用。许多高效的图像复原算法都是以维纳滤波为基础形成的。
clear all;
close all;
I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);
LEN = 25;
THETA = 20;
PSF = fspecial('motion', LEN, THETA); %产生运动模糊,运动位移25,角度20°
J = imfilter(I, PSF, 'conv', 'circular'); %图像退化
NSR = 0;
K = deconvwnr(J, PSF, NSR); %维纳滤波复原
figure;
subplot(131), imshow(I);
subplot(132), imshow(J);
subplot(133), imshow(K);
约束最小二乘法复原
在MATLAB软件中,采用函数deconvreg( )进行图像的约束最小二乘法复原。
该函数的详细调用格式为:
J=deconvreg(I, PSF)
%该函数中对输入图像I进行约束最小二乘法复原,PSF为点扩展函数,返回值J为复原后得到的图像
J=deconvreg(I, PSF, NOISEPOWER)
%该函数中对参NOISEPOWER进行设置,该参数为噪声的强度,默认值为0
J-deconvreg(I, PSF, NOISEPOWER, LRANGE)
%该函数中对参数LRANGE进行设置,该参数为拉格朗日算子的搜索范围,默认值为[10-9,109]
J=deconvreg(I, PSF, NOISEPOWER, LRANGE, REGOP)
%该函数中参数REGOP为约束算子
[J, LAGRA]=deconvreg(I, PSF...)
%该函数总返回值LAGRA为最终采用的拉格朗日算子
举个例子
clear all;
close all;
I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);
PSF= fspecial('gaussian', 8, 4);
J = imfilter(I, PSF, 'conv'); %图像模糊化
figure;
subplot(121), imshow(I);
subplot(122), imshow(J);
v = 0.02;
K = imnoise(J, 'gaussian', 0, v); %模糊化图像添加高斯噪声
NP = v*prod(size(I));
L = deconvreg(K, PSF, NP);
figure;
subplot(121), imshow(K);
subplot(122), imshow(L);
LUCY-RICHARDSON复原
在MATLAB软件中,函数deconvlucy( )采用加速收敛的Lucy-Richardson算法对图像进行复原。
该函数的详细调用格式为:
J=deconvlucy(I, PSF)
%该函数中对输入图像I采用Lucy-Richardson算法进行图像复原,PSF为点扩展函数,返回值J为复原后得到的图像。
J=deconvlucy(I, PSF, NUMIT)
%该函数中参数NUMIT为算法的重复次数,默认值为10。
J-deconvlucy(I, PSF, NUMIT, DAMPAR)
%该函数中参数DAMPAR为偏差阈值,默认值为0。
J=deconvlucy(I, PSF, NUMIT, DAMPAR, WEIGHT)
%该函数中参数WEIGHT为像素的加权值,默认为原始图像的数值。
J=deconvlucy(I, PSF, NUMIT, DAMPAR, WEIGHT, READOUT)
%该函数中参数READOUT为噪声矩阵,默认值为0。
J=deconvlucy(I, PSF, NUMIT, DAMPAR, WEIGHT, READOUT, SUBSMPL)
%该函数中参数SUBSMPL为子采样时间,默认值为1。
举个栗子
clear all;
close all;
I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);
LEN = 30;
THETA = 20;
PSF = fspecial('motion', LEN, THETA); %产生运动模糊,运动位移30,角度20°
J = imfilter(I, PSF, 'conv', 'circular'); %图像退化
figure;
subplot(121), imshow(I);
subplot(122), imshow(J);
K = deconvlucy(J, PSF, 5); %5次迭代
L = deconvlucy(J, PSF, 15); %15次迭代
figure;
subplot(121), imshow(K);
subplot(122), imshow(L);
原图与运动模糊的结果
5次迭代与15次迭代的结果
盲解卷积复原
前面介绍的图像复原方法,需要预先知道退化图像的PSF。在实际应用中,经常在不知道PSF的情况下对图像进行复原。盲解卷积复原方法,不需要预先知道PSF,而且可以对PSF进行估计。盲解卷积复原算法的优点是在对退化图像毫无先验知识的情况下,仍然能够进行复原。
clear all;
close all;
I = imread('lena_color_512.tif');
I = rgb2gray(I);
I = im2double(I);
LEN = 20;
THETA = 20;
PSF = fspecial('motion', LEN, THETA); %产生运动模糊,运动位移20,角度20°
J = imfilter(I, PSF, 'conv', 'circular'); %图像退化
INITPSF = ones(size(PSF));
[K, PSF2] = deconvblind(J, INITPSF, 30); %盲解卷积原理
figure;
subplot(121), imshow(PSF, []);
subplot(122), imshow(PSF2, []);
axis auto;
figure;
subplot(121), imshow(J);
subplot(122), imshow(K);
下图为图像运动模糊的原理,及盲解卷积的原理,与其轮廓大致相同
图像退化结果及盲解卷积的结果
这些知识点真是超级多捏,码完赶紧睡觉,太头秃了!