码迷,mamicode.com
首页 > 其他好文 > 详细

多图片平均法降噪

时间:2015-12-08 22:15:37      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:

## 理论 ##
在相机采集到的图像中,往往会存在一定的噪声。这种噪声一般来说在空间域是互不相关的,并且是一种加性噪声。对于一幅相机采集到的图像,可以表示为无噪声图像和加性噪声的组成,也即:
$$
\begin{equation} \label{imgeq}
g(x,y)=f(x,y)+ \eta(x,y)
\end{equation}
$$
其中:$g(x,y)$为采集图像,$f(x,y)$为无噪声图像,$\eta(x,y)$为噪声。
去噪的过程就是从已知的$g(x,y)$来近似得到$f(x,y)$的过程。
对于同一个场景拍摄的多张图像来说,$f_{i}(x,y)$是相同的,而$\eta_{i}(x,y)$是随机的且相互之间不相关,相同场景的k幅图像图像的均值可以表示如下
$$
\begin{equation} \label{imgavrg}
\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}
E\{\bar{g}(x,y)\}=f(x,y)
\end{equation}
$$
平均图像的方差
$$
\begin{equation} \label{imgvar}
\sigma_{\bar{g}(x,y)}^{2}=\frac{1}{K}\sigma_{\eta(x,y)}^{2}
\end{equation}
$$
$$
\begin{equation} \label{imgsd}
\sigma_{\bar{g}(x,y)}=\frac{1}{\sqrt{K}}\sigma_{\eta(x,y)}
\end{equation}
$$
从式$\eqref{imgexp}$中我们可以发现,同场景的多幅图像的均值的期望是无噪点图像,但是会存在一些扰动,这些扰动的标准差$\eqref{imgsd}$就决定了噪声的强度。我们对图像去噪的本质就是减少在空间域上的标准差。从式$\eqref{imgsd}$中我们不难发现,通过增大$K$值,即增加平均图像的数量,即可减少噪声。
但同时我们可以发现:$\sigma\varpropto\frac{1}{\sqrt{K}}$,$\frac{\partial\sigma}{\partial K}=-\frac{1}{2\sqrt{K^3}}$,随着$K$值的增大,$\sigma$的变化越来越小,用平均法去噪时,单单通过提高图像数量的作用是很小的。

## 实验 ##
### 目的 ###
1.    验证同场景下多图像平均可以进行去噪。
2.    随着图像数量的增大,图像噪点变化越来越小。
### 数据集 ###
同一场景的179幅照片,用短时间采集完成。
以下是其中的一幅图片
技术分享
其局部细节:
技术分享
可以发现图像上的噪点是比较多的。
### 程序设计 ###
程序的处理过程为:
*    读取图像
*    求平均值
*    显示图像

程序源码:
matlab
```matlab
% 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);
```

C++(OpenCV2.4)
```cpp
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <sstream>
#include <exception>
#include <iostream>
 
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




多图片平均法降噪

标签:

原文地址:http://www.cnblogs.com/lianera/p/5030928.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!