天天看点

多图片平均法降噪

理论

在相机采集到的图像中,往往会存在一定的噪声。这种噪声一般来说在空间域是互不相关的,并且是一种加性噪声。对于一幅相机采集到的图像,可以表示为无噪声图像和加性噪声的组成,也即:

\begin{equation} \label{imgeq}\tag{1}

g(x,y)=f(x,y)+ \eta(x,y)

\end{equation}

其中: g(x,y) 为采集图像, f(x,y) 为无噪声图像, η(x,y) 为噪声。

去噪的过程就是从已知的 g(x,y) 来近似得到 f(x,y) 的过程。

对于同一个场景拍摄的多张图像来说, fi(x,y) 是相同的,而 ηi(x,y) 是随机的且相互之间不相关,相同场景的k幅图像图像的均值可以表示如下

\begin{equation} \label{imgavrg}\tag{2}

\bar{g}(x,y)=\frac{1}{K}\sum_{i=1}^K[f_{i}(x,y)+\eta_{i}(x,y)]=f(x,y)+\frac{1}{K}\sum_{i=1}^K\eta_{i}(x,y)

\end{equation}

由于噪点随机且不相关,可得其平均图像的期望

\begin{equation} \label{imgexp}\tag{3}

E\{\bar{g}(x,y)\}=f(x,y)

\end{equation}

平均图像的方差

\begin{equation} \label{imgvar}\tag{4}

\sigma_{\bar{g}(x,y)}^{2}=\frac{1}{K}\sigma_{\eta(x,y)}^{2}

\end{equation}

\begin{equation} \label{imgsd}\tag{5}

\sigma_{\bar{g}(x,y)}=\frac{1}{\sqrt{K}}\sigma_{\eta(x,y)}

\end{equation}

从式 (???) 中我们可以发现,同场景的多幅图像的均值的期望是无噪点图像,但是会存在一些扰动,这些扰动的标准差 (???) 就决定了噪声的强度。我们对图像去噪的本质就是减少在空间域上的标准差。从式 (???) 中我们不难发现,通过增大 K 值,即增加平均图像的数量,即可减少噪声。

但同时我们可以发现:σ∝1K√, ∂σ∂K=−12K3√ ,随着 K 值的增大,σ的变化越来越小,用平均法去噪时,单单通过提高图像数量的作用是很小的。

实验

目的

  1. 验证同场景下多图像平均可以进行去噪。
  2. 随着图像数量的增大,图像噪点变化越来越小。

数据集

同一场景的179幅照片,用短时间采集完成。

以下是其中的一幅图片

多图片平均法降噪

其局部细节:

多图片平均法降噪

可以发现图像上的噪点是比较多的。

程序设计

程序的处理过程为:

* 读取图像

* 求平均值

* 显示图像

程序源码:

% get image file names
DIR = 'imgs';
imgFiles = dir([DIR , '/*.jpg']);
[N, C]= size(imgFiles);


% get the image size
img = im2double(imread([DIR , '/', imgFiles(1).name]));
figure(1);
imshow(img);

img = img / N;
% calculate the average
for m = 2:N
    img = img + im2double(imread([DIR , '/', imgFiles(m).name])) / N;
end
figure(2);
imshow(img);#include 
  
   
#include 
   
    
#include 
    
     
#include 
     
      
#include 
      
        #include 
       
         void denoise() { const int N = 179; cv::Mat avrg_img; for (int i = 0; i < N; i++){ std::ostringstream oss; oss << "imgs/img (" << i+1 << ").jpg"; cv::Mat image = cv::imread(oss.str()); // convert to double image.convertTo(image, CV_32F, 1.0 / 255.0); if (i == 0){ cv::namedWindow("noisy image"); cv::imshow("noisy image", image); avrg_img = image / N; } else avrg_img += image / N; } cv::namedWindow("denoised image"); cv::imshow("denoised image", avrg_img); avrg_img.convertTo(avrg_img, CV_8UC3, 255.0); cv::imwrite("denoised.jpg", avrg_img); } int main() { try{ denoise(); } catch (std::exception &e){ std::cerr << e.what() << std::endl; } cv::waitKey(); return 0; }
       
      
     
    
   
  
           

测试

对179张图片进行测试,结果如下:

多图片平均法降噪

对照原图:

多图片平均法降噪

可以看出,噪点明显减少了,从而验证了多图像平均法去噪的可行性。

改变平均的图片数量, K 取2,3...10,可以得到一系列图像,如以下gif所示:

多图片平均法降噪

可以看出,从原图到 K=2 ,噪点减少显著,而从 K=9 到 K=10 ,噪点变化较少,验证了之前的数学模型。

参考

[1] 冈萨雷斯.数字图像处理[M]. 阮秋琦译. 北京:电子工业出版社. 2011.6

继续阅读