开始之前
再说上一篇文章中, 我们想按照噪声产生, 然后将降噪的, 但是限于篇幅, 我就放在这一篇里面了,
说起图像的噪声问题就又回到了我们上一章的内容, 把噪声当作信号处理, 实际上数字图像处理实际上也是在进行数字信号的处理过程, 我们这一章就是将滤除信号的过程,
根据上一章的方式, 我们对图像添加噪声, 然后计算 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 512∗512, 如果需要可以裁剪出来,
CSDN 上传会自己转存图片, 上传资源比较麻烦, 懒得搞, 我这边的图片都存在了 gitee 的图床上, 原图存储的 , 有需要的可以自己取用
传统图像降噪算法及其对比
之前提到过的【技术综述】一文道尽传统图像降噪方法
这篇文章讲的还比较详细, 大概的给我们讲了一下传统的降噪的方法,
这里我想将各种滤波分开进行实现, 但是比较麻烦, 我就直接在一篇文章中写了吧…
目前常用的降噪的方法主要可以分为空域降噪与频域降噪, 空域滤波也是我们常用的使用空间处理的方式,计算量小, 简单易用. 频域比较难理解,计算量也比较大, 但是在很多情况结果比较有效…
所以我们主要的部分也是空间域处理的方式, 也比较直观. opencv 的例程中Smoothing Images 章节大概讲了一下目前使用的模糊方式, 其实模糊是相对的, 也是进行降噪的一个有利手段, 在处理掉噪声的同时, 会导致原始图像的细节模糊, 进而丢失一部分图像信息,我们之后看下图像测试结果. 同时在例程中还提到了一本书Computer