用平均的方法去除噪声

                                         用平均的方法去除噪声

技术/方法

什么?平均?你是说滤波?

并不是!这种方法并不使用任何滤波(去噪)算法对图像进行处理。实际上,这种方法与滤波相反:你可以获得更为清晰的图像!

在平均法中,我们假设有一系列同一场景的一些图像,只不过每一幅图像具有不同的“噪声模式”。

一旦我们拥有多幅同一场场景的图像,是的,这种你在学校就学过的平均方法:相加之后除以图像的数量。

准备开始实验

首先,我们必须获取到多幅图像,每一幅图像中都有一些噪声。我们使用Photoshop以及自动选择模式生成25幅图像,每一幅图像中添加8%的高斯噪声。

开始编码

首先,确保你包含了OpenCV库中的cv.lib cvaux.lib cxcore.lib highgui.lib文件。

#include <cv.h>
#include <highgui.h>

现在,主函数为:

int main()
{
    IplImage* imgRed[25];
    IplImage* imgGreen[25];
    IplImage* imgBlue[25];

我们一开始定义了三个数组,用以包含25幅图像每一个通道。我们现在载入25幅图像。

  for(int i=0;i<25;i++)
    {
        IplImage* img;
        char filename[150];
        sprintf(filename, "%d.jpg", (i+1));
        img = cvLoadImage(filename);
        imgRed[i] = cvCreateImage(cvGetSize(img), 8, 1);
        imgGreen[i] = cvCreateImage(cvGetSize(img), 8, 1);
        imgBlue[i] = cvCreateImage(cvGetSize(img), 8, 1);
        cvSplit(img, imgRed[i], imgGreen[i], imgBlue[i], NULL);
        cvReleaseImage(&img);
    }

让我们一行一行查看上述代码。我们首先创建一个循环,在循环中我们创建保存图像的临时变量,随后,我们输入载入图像的名称。载入图像的名称可以是1.JPG 2.JPG等等,之后我们载入图像到 img变量。

下一步,我们分配了三个通道的内存。随后,我们把载入的图像分离成三个通道的图像,分别保存在刚刚分配的三个通道内存中。

现在,我们在添加如下代码段:

 CvSize imgSize = cvGetSize(imgRed[0]);
    IplImage* imgResultRed = cvCreateImage(imgSize, 8, 1);
    IplImage* imgResultGreen = cvCreateImage(imgSize, 8, 1);

    IplImage* imgResultBlue = cvCreateImage(imgSize, 8, 1);

    IplImage* imgResult = cvCreateImage(imgSize, 8, 3);

我们再次分配了三个通道的内存,用以保存平均法去噪的图像结果。

现在,实现平均去噪的方法:

for(int y=0;y<imgSize.height;y++)
    {
        for(int x=0;x<imgSize.width;x++)
        {
            int theSumRed=0;
            int theSumGreen=0;
            int theSumBlue=0;
            for(int i=0;i<25;i++)
            {
                theSumRed+=cvGetReal2D(imgRed[i], y, x);
                theSumGreen+=cvGetReal2D(imgGreen[i], y, x);
                theSumBlue+=cvGetReal2D(imgBlue[i], y, x);
            }
            theSumRed = (float)theSumRed/25.0f;
            theSumGreen = (float)theSumGreen/25.0f;
            theSumBlue = (float)theSumBlue/25.0f;
            cvSetReal2D(imgResultRed, y, x, theSumRed);
            cvSetReal2D(imgResultGreen, y, x, theSumGreen);
            cvSetReal2D(imgResultBlue, y, x, theSumBlue);
        }
    }

我们获取每一幅图像的每一个像素,然后我们定义像素的和,用以存放25幅噪声图像的每一个通道的像素和。随后,我们把每一个通道的像素和除以图像的数量,然后在把三通道的图像进行合并,生成最终的图像。

很简单?下面试图像的输出结果:

很多噪声的图像
很多噪声的原始图像

 

噪声都去哪呢?
结果图像。噪声都去哪呢?

理论知识

很奇妙是吧!?这仅仅使用了25幅图像的平均结果,如果图像越多,去噪效果越好。

 

图像中的噪声是随机的,有高斯随机噪声以及其他一些噪声。如下图是高斯噪声。

高斯噪声图像

假设我们把每一个像素的灰度值相加,之后再除以总的像素值,那么最终得到的结果将会是0或者近似0的结果

因此,如果我们把多幅不同模式的噪声图像没一个像素相加,之后在除以总的像素数量,那么,最终将使得噪声消除掉。

数学公式:

我们用gi代表25幅图像,因此,gi就是原始图像和噪声图像的和。即:

我们使用的平均方法可以表示为:

我们把k(实际实验是25幅)幅图像相加,然后在除以k。由高斯分布可知:

因此,通过上述方法,我们最后得的结果即为f(x,y),即图像的原始数据。

更多图像将得到更佳的效果:

原始图像
两幅图像的平均结果
五幅图像的评价结果
十五幅图像的评价结果
二十五幅图像的评价结果

翻译自:http://aishack.in/tutorials/noise-reduction-averaging-theory/

  • 9
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值