opencv-10-图像滤波-噪声添加与均值滤波-含opencv C++ 代码实现

开始之前

再说上一篇文章中, 我们想按照噪声产生, 然后将降噪的, 但是限于篇幅, 我就放在这一篇里面了,
说起图像的噪声问题就又回到了我们上一章的内容, 把噪声当作信号处理, 实际上数字图像处理实际上也是在进行数字信号的处理过程, 我们这一章就是将滤除信号的过程,

根据上一章的方式, 我们对图像添加噪声, 然后计算 PSNR 与 SSIM 参数, 然后通过降噪, 再从新计算参数值, 比较我们算法的效果 对比我们的算法效果, 看正文吧

目录

正文

我们在上一章给出了两种噪声的添加方式, 可以根据我们的需求添加椒盐噪声和高斯噪声, 但是由于我们的噪声添加使用了随机数 , 导致我们在每次进行的结果可能不一致, 所以我们提前设计好噪声情况, 将图片存储起来, 后面我们进行滤波的时候, 都使用一样的照片, 这样我们能够保证每次的结果是一致的, 这样就能进行算法的对比了,

生成噪声图像

我们在上一章给出了不同噪声情况下图像结果, 也给出了一个链接, 对比了更多情况下的图像噪声情况, 可以参考, 所以我们考虑五种情况吧 分别是低椒盐噪声, 高椒盐噪声,低高斯噪声, 高高斯噪声,低椒盐混合低高斯噪声, 高椒盐混合高高斯噪声. 我们分别将图片进行存储便能够得到结果

说明一下: 之前的算法使用的 lena 图像 忘记从那搞来的了, 今天对比了一下, 发现图像不太对, 我现在找到opencv的一个标准图像Lena.jpg, 我下载下来了, 转换成了 lena.png 的图像, 可以见lena.png 这幅图, 可以直接访问链接 https://gitee.com/schen00/BlogImage/raw/master/小书匠/1588298950276.png 直接下载即可…

这里的处理算法比较简单, 我们来看代码

void MainWindow::testFunc1(void)
{
   
    // 用于生成 测试图像 一共6幅图像
    std::vector<cv::Mat> noise_img(6);
    // 初始化为原始图像
    for(auto &m: noise_img)
        m = gSrcImg.clone();

    // 分别添加 低, 高, 低混合, 高混合 共6幅图像
    addSaltNoise(noise_img[0],1000);
    addSaltNoise(noise_img[1],10000);

    addGaussianNoise(noise_img[2],0,1);
    addGaussianNoise(noise_img[3],100,10);

    addSaltNoise(noise_img[4],1000);
    addGaussianNoise(noise_img[4],0,1);

    addSaltNoise(noise_img[5],10000);
    addGaussianNoise(noise_img[5],100,10);


    // 计算 6幅图像的  psnr 和 ssim 然后存储结果值
    std::vector<double> psnr(6);
    std::vector<cv::Scalar> mssim(6);

    QString res_temp = "image-%1: psnr:%2, mssim: B:%3 G:%4 R:%5 ";
    QString res_str;

    // 计算每个图像的 参数值, 然后存储起来
    for(int i=0;i<6;i++)
    {
   
        psnr[i] = getPSNR(gSrcImg, noise_img[i]);
        mssim[i] = getMSSIM(gSrcImg, noise_img[i]);
        res_str = res_temp.arg(i+1)
                            .arg(psnr[i])
                            .arg(mssim[i].val[0])
                            .arg(mssim[i].val[1])
                            .arg(mssim[i].val[2]);

        ui->pt_log->appendPlainText(res_str);
        cv::imwrite("../testimages/noise/lena-" + std::to_string(i+1) + ".png", noise_img[i]);
    }
}

我们将图片输出, 然后输出了每幅图的参数, 同时将结果图存储下来, 由于我们在实际进行图像处理的时候会有很多

image-1: psnr:29.4922, mssim: B:0.880587 G:0.888243 R:0.944992 
image-2: psnr:19.4727, mssim: B:0.353134 G:0.383638 R:0.629353 
image-3: psnr:46.8705, mssim: B:0.991138 G:0.991732 R:0.991185 
image-4: psnr:9.15966, mssim: B:0.492354 G:0.482311 R:0.680167 
image-5: psnr:29.2807, mssim: B:0.874794 G:0.881488 R:0.935624 
image-6: psnr:8.92587, mssim: B:0.392531 G:0.393254 R:0.655795 

我这里使用之前提到的 图像"拼接" 的方式将图像拼接起来, 这样我们可以更为直观的比较, 图像尺寸都是 512 ∗ 512 512*512 512512, 如果需要可以裁剪出来,

CSDN 上传会自己转存图片, 上传资源比较麻烦, 懒得搞, 我这边的图片都存在了 gitee 的图床上, 原图存储的 , 有需要的可以自己取用

噪声图像"拼接"图

传统图像降噪算法及其对比

之前提到过的【技术综述】一文道尽传统图像降噪方法
这篇文章讲的还比较详细, 大概的给我们讲了一下传统的降噪的方法,
这里我想将各种滤波分开进行实现, 但是比较麻烦, 我就直接在一篇文章中写了吧…

目前常用的降噪的方法主要可以分为空域降噪与频域降噪, 空域滤波也是我们常用的使用空间处理的方式,计算量小, 简单易用. 频域比较难理解,计算量也比较大, 但是在很多情况结果比较有效…

所以我们主要的部分也是空间域处理的方式, 也比较直观. opencv 的例程中Smoothing Images 章节大概讲了一下目前使用的模糊方式, 其实模糊是相对的, 也是进行降噪的一个有利手段, 在处理掉噪声的同时, 会导致原始图像的细节模糊, 进而丢失一部分图像信息,我们之后看下图像测试结果. 同时在例程中还提到了一本书Computer

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在OpenCV中生成并添加高斯噪声,可以使用以下步骤: 1. 读取图像:使用`imread()`函数读取要添加噪声图像。 2. 创建噪声图像:创建一个与原始图像大小相同的噪声图像,可以使用`Mat`类的构造函数来创建一个空的图像。 3. 生成高斯噪声:使用`randn()`函数生成均值为0,标准差为`sigma`的高斯噪声。可以通过乘以标准差并加上均值来获得所需的高斯噪声。 ```c++ Mat noise = Mat(image.size(), image.type()); randn(noise, Scalar(0), Scalar(sigma)); ``` 4. 添加噪声:将生成的高斯噪声添加到原始图像中,可以使用`add()`函数将噪声添加到原始图像中。 ```c++ Mat noisy_image; add(image, noise, noisy_image); ``` 5. 显示结果:使用`imshow()`函数显示添加噪声图像,使用`waitKey()`函数等待用户按下键盘上的任意键。 ```c++ imshow("Original Image", image); imshow("Noisy Image", noisy_image); waitKey(0); ``` 完整的示例代码如下: ```c++ #include <opencv2/opencv.hpp> using namespace cv; int main() { Mat image = imread("lena.jpg", IMREAD_GRAYSCALE); double sigma = 20; Mat noise = Mat(image.size(), image.type()); randn(noise, Scalar(0), Scalar(sigma)); Mat noisy_image; add(image, noise, noisy_image); imshow("Original Image", image); imshow("Noisy Image", noisy_image); waitKey(0); return 0; } ``` 在上面的示例中,我们生成了一个标准差为20的高斯噪声,并将其添加到原始图像中,最后将添加噪声图像显示在屏幕上。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值