最近在学斯坦福的数字图像处理,感觉真的无论是课件还是习题都太棒了,想记录下自己这一段的成长历程。
1.针对降噪的带噪图像相加
这里主要用了这样的一个定理:对M副加性噪声图像进行平均,可以使图像的平方信噪比提高M倍。
证明过程如下:
D
i
(
x
,
y
)
=
S
(
x
,
y
)
+
N
i
(
x
,
y
)
where
E
{
N
i
(
x
,
y
)
}
=
0
D_{i}(x, y)=S(x, y)+N_{i}(x, y) \text { where } E\left\{N_{i}(x, y)\right\}=0
Di(x,y)=S(x,y)+Ni(x,y) where E{Ni(x,y)}=0
其中信噪比为
P
(
x
,
y
)
=
S
2
(
x
,
y
)
E
{
N
2
(
x
,
y
)
}
P(x, y)=\frac{S^{2}(x, y)}{E\left\{N^{2}(x, y)\right\}}
P(x,y)=E{N2(x,y)}S2(x,y)
D
‾
(
x
,
y
)
=
1
M
∑
i
=
1
M
[
S
(
x
,
y
)
+
N
i
(
x
,
y
)
]
P
‾
(
x
,
y
)
=
S
2
(
x
,
y
)
E
{
1
M
2
[
∑
i
=
1
M
N
i
(
x
,
y
)
]
2
}
\begin{aligned} \overline{D}(x, y)=& \frac{1}{M} \sum_{i=1}^{M}\left[S(x, y)+N_{i}(x, y)\right] \\ \overline{P}(x, y)=& \frac{S^{2}(x, y)}{E\left\{\frac{1}{M^{2}}\left[\sum_{i=1}^{M} N_{i}(x, y)\right]^{2}\right\}} \end{aligned}
D(x,y)=P(x,y)=M1i=1∑M[S(x,y)+Ni(x,y)]E{M21[∑i=1MNi(x,y)]2}S2(x,y)
E
{
[
N
1
(
x
,
y
)
+
N
2
(
x
,
y
)
]
2
}
=
E
{
N
1
2
(
x
,
y
)
+
N
2
2
(
x
,
y
)
}
+
2
E
{
N
1
(
x
,
y
)
}
ε
{
N
2
(
x
,
y
)
}
E\left\{\left[N_{1}(x, y)+N_{2}(x, y)\right]^{2}\right\}=E\left\{N_{1}^{2}(x, y)+N_{2}^{2}(x, y)\right\}+2 E\left\{N_{1}(x, y)\right\} \varepsilon\left\{N_{2}(x, y)\right\}
E{[N1(x,y)+N2(x,y)]2}=E{N12(x,y)+N22(x,y)}+2E{N1(x,y)}ε{N2(x,y)}
由于
N
1
N_1
N1和
N
2
N_2
N2独立
E
{
[
N
1
(
x
,
y
)
+
N
2
(
x
,
y
)
]
2
}
=
E
{
N
1
2
(
x
,
y
)
}
+
E
{
N
2
2
(
x
,
y
)
}
E\left\{\left[N_{1}(x, y)+N_{2}(x, y)\right]^{2}\right\}=E\left\{N_{1}^{2}(x, y)\right\}+E\left\{N_{2}^{2}(x, y)\right\}
E{[N1(x,y)+N2(x,y)]2}=E{N12(x,y)}+E{N22(x,y)}
所以
P
‾
(
x
,
y
)
=
M
2
S
2
(
x
,
y
)
∑
i
=
1
M
N
i
2
(
x
,
y
)
=
M
2
S
2
(
x
,
y
)
M
N
2
(
x
,
y
)
=
M
P
(
x
,
y
)
\overline{P}(x, y)=\frac{M^{2} S^{2}(x, y)}{\sum_{i=1}^{M} N_{i}^{2}(x, y)}=\frac{M^{2} S^{2}(x, y)}{M N^{2}(x, y)}=M P(x, y)
P(x,y)=∑i=1MNi2(x,y)M2S2(x,y)=MN2(x,y)M2S2(x,y)=MP(x,y)
这里我们是可以用Matlab代码来实现这个效果的,具体代码如下:
function[]= mygaussian()
clear, clc, close all
% Load test image
img = im2double(rgb2gray(imread('quadnight.jpeg')));
% Loop over number of samples
nArray = [1, 2, 8, 32];
for i = 1 : numel(nArray)
N = nArray(i);
avgImg = zeros(size(img));
% Add Gaussian noise, accumulate average image
for j = 1 : N
noisyImg = imnoise(img, 'gaussian', 0, 0.02);
avgImg = avgImg + noisyImg;
end % end j
% Show image
avgImg = avgImg / N;
subplot(2, 2, i);
imshow(avgImg);
title([num2str(N), ' image(s)']);
imwrite(avgImg, ['Image_Averaging_', num2str(N), 'avg.png']);
代码是从斯坦福老师那里直接摘得,感觉国外的老师真的是很不一样的,代码都写的很漂亮,简单的介绍一下这个函数的实现过程吧,首先将图片转化为灰度图像,然后转化为double,主要是为了防止溢出,nArray表示用多少个图相加,g=imnoise(f,'gaussian',m,var)
将均值m,方差为var的高斯噪声加到图像f上,默认值是均值m为0,方差var为0.01的噪声。
我们可以看一下效果
可以看出来,真的变清楚了很多。
2.不同曝光度图像的整合
3.图像的减法
图像的减法主要用来是发现两幅图片的区别。
function[]=imgSub()
clear, clc, close all
% Load test images
maskImg = im2double(imread('mask.jpg'));
liveImg = im2double(imread('live.jpg'));
% Calculate difference image and enhance contrast
diffImg = abs(maskImg - liveImg);
histeqDiffImg = adapthisteq(diffImg, 'ClipLimit', 0.005);
% Show images
subplot(1, 4, 1), imshow(liveImg);
title('Live image');
subplot(1, 4, 2), imshow(maskImg);
title('Mask image');
subplot(1, 4, 3), imshow(diffImg);
title('Difference image');
subplot(1, 4, 4), imshow(histeqDiffImg);
title('Histogram equalized difference image');
% Save images
imwrite(diffImg, 'Image_Subtraction_diff.png');
imwrite(histeqDiffImg, 'Image_Subtraction_histeqdiff.png');
adapthisteq
函数执行所谓的对比度受限的自适应直方图均衡,其用法 https://blog.csdn.net/Sousky/article/details/73484691 介绍的十分的清楚。
下面减法的运用就更厉害了!下面这个算法是检验一个视频中出现的异物的算法。
function[]= videoSub()
% Read video
vrObj = VideoReader('surveillance.mpg');
vwObj = VideoWriter('Background_Subtraction', 'Motion JPEG AVI');
%设置写的文件的播放速率
vwObj.FrameRate = 30;
vwObj.Quality = 95;
open(vwObj);
%获取读的文件的帧数
nFrames = vrObj.NumberOfFrames;
% Perform background accumulation and subtraction
alpha = 0.95;
theta = 0.1;
background = im2double(rgb2gray(read(vrObj, 1)));
for i = 1 : nFrames
currImg = im2double(rgb2gray(read(vrObj, i)));
background = alpha * background + (1 - alpha)* currImg;
diffImg = abs(currImg - background);
%0-1矩阵
threshImg = diffImg > theta;
subplot(2, 2, 1), imshow(currImg), title('New frame');
subplot(2, 2, 2), imshow(background), title('Background frame');
subplot(2, 2, 3), imshow(diffImg), title('Difference image');
subplot(2, 2, 4), imshow(threshImg), title('Thresholded difference image');
currFrame = getframe(1);
writeVideo(vwObj, currFrame);
end
close(vwObj);
% Save images
imwrite(currImg, 'Background_Subtraction_curr.png');
imwrite(background, 'Background_Subtraction_background.png');
imwrite(threshImg, 'Background_Subtraction_thresh.png');