如何为彩色图像添加噪声 - Opencv
How to add Noise to Color Image - Opencv
我正在尝试为图像添加噪声,然后对其进行降噪以测试我的降噪算法!因此,对于基准测试,我指的是 Online Test samples。我正在尝试复制噪声模型。
参考这个帖子 1 , 2 我正在为这样的图像添加噪点!
Mat mSource_Bgr;
mSource_Bgr= imread(FileName_S,1);
double m_NoiseStdDev=10;
Mat mNoise_Bgr = mSource_Bgr.clone();
Mat mGaussian_noise = Mat(mSource_Bgr.size(),CV_8UC3);
randn(mGaussian_noise,0,m_NoiseStdDev);
mNoise_Bgr += mGaussian_noise;
normalize(mNoise_Bgr,mNoise_Bgr,0, 255, CV_MINMAX, CV_8UC3);
imshow("Output Window",mNoise_Bgr);
//imshow("Gaussian Noise",mGaussian_noise);
我的输入图片
输出带有噪声的图像
问题:
向图像添加噪点改变图像的整体亮度,进而改变我的最终结果 PSNR!
我想得到尽可能接近的结果to this one!
到目前为止我尝试了什么!
我试过只在颜色通道中添加噪点。
将输入图像转换为 YUV 颜色 space
仅在 UV 颜色通道中添加噪声并保持 Y 通道不变。
结果非常糟糕,图像的整体颜色发生了变化!如果需要,将添加代码!
非常感谢任何有关此的建议!可以给我一些为图像添加噪点的公式!
看起来您的噪声矩阵无法获得负值,因为它具有 unsigned char 元素类型。尝试使用实值矩阵进行运算,应该会有帮助。
谢谢@Andrey Smorodov 的见解!
我成功了!这是我在彩色图像中添加噪声的更新代码。希望这对某人有用!
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
inline BYTE Clamp(int n)
{
n = n>255 ? 255 : n;
return n<0 ? 0 : n;
}
bool AddGaussianNoise(const Mat mSrc, Mat &mDst,double Mean=0.0, double StdDev=10.0)
{
if(mSrc.empty())
{
cout<<"[Error]! Input Image Empty!";
return 0;
}
Mat mGaussian_noise = Mat(mSrc.size(),CV_16SC3);
randn(mGaussian_noise,Scalar::all(Mean),Scalar::all(StdDev));
for (int Rows = 0; Rows < mSrc.rows; Rows++)
{
for (int Cols = 0; Cols < mSrc.cols; Cols++)
{
Vec3b Source_Pixel= mSrc.at<Vec3b>(Rows,Cols);
Vec3b &Des_Pixel= mDst.at<Vec3b>(Rows,Cols);
Vec3s Noise_Pixel= mGaussian_noise.at<Vec3s>(Rows,Cols);
for (int i = 0; i < 3; i++)
{
int Dest_Pixel= Source_Pixel.val[i] + Noise_Pixel.val[i];
Des_Pixel.val[i]= Clamp(Dest_Pixel);
}
}
}
return true;
}
bool AddGaussianNoise_Opencv(const Mat mSrc, Mat &mDst,double Mean=0.0, double StdDev=10.0)
{
if(mSrc.empty())
{
cout<<"[Error]! Input Image Empty!";
return 0;
}
Mat mSrc_16SC;
Mat mGaussian_noise = Mat(mSrc.size(),CV_16SC3);
randn(mGaussian_noise,Scalar::all(Mean), Scalar::all(StdDev));
mSrc.convertTo(mSrc_16SC,CV_16SC3);
addWeighted(mSrc_16SC, 1.0, mGaussian_noise, 1.0, 0.0, mSrc_16SC);
mSrc_16SC.convertTo(mDst,mSrc.type());
return true;
}
int main(int argc, const char* argv[])
{
Mat mSource= imread("input.png",1);
imshow("Source Image",mSource);
Mat mColorNoise(mSource.size(),mSource.type());
AddGaussianNoise(mSource,mColorNoise,0,10.0);
imshow("Source + Color Noise",mColorNoise);
AddGaussianNoise_Opencv(mSource,mColorNoise,0,10.0);//I recommend to use this way!
imshow("Source + Color Noise OpenCV",mColorNoise);
waitKey();
return 0;
}
主要有两种方法可以将awgn噪声(平均值= 0,标准差= 30)添加到彩色图像中。
首先:可以独立的给红绿蓝各通道(或其他任何颜色model-HSI、YUV、Lab)添加均值=0,标准差=30的awgn噪声;然后结合噪声通道形成彩色噪声图像。
第二种:使用in-built函数直接给彩色图像加噪点。例如。 Matlab 中的 imnoise()。
我尝试了两种方法(imnoise 和 independently),我得到了相同的结果。
您提到“我尝试只在颜色通道中添加噪点。
将输入图像转换为 YUV 颜色 space
仅在 UV 颜色通道中添加噪声并保持 Y 通道不变。"
如果你使用的是YUV颜色模型,我建议你反其道而行之。保持 U 和 V 通道不变,仅向 Y 通道添加噪声。
我正在尝试为图像添加噪声,然后对其进行降噪以测试我的降噪算法!因此,对于基准测试,我指的是 Online Test samples。我正在尝试复制噪声模型。
参考这个帖子 1 , 2 我正在为这样的图像添加噪点!
Mat mSource_Bgr;
mSource_Bgr= imread(FileName_S,1);
double m_NoiseStdDev=10;
Mat mNoise_Bgr = mSource_Bgr.clone();
Mat mGaussian_noise = Mat(mSource_Bgr.size(),CV_8UC3);
randn(mGaussian_noise,0,m_NoiseStdDev);
mNoise_Bgr += mGaussian_noise;
normalize(mNoise_Bgr,mNoise_Bgr,0, 255, CV_MINMAX, CV_8UC3);
imshow("Output Window",mNoise_Bgr);
//imshow("Gaussian Noise",mGaussian_noise);
我的输入图片
输出带有噪声的图像
问题:
向图像添加噪点改变图像的整体亮度,进而改变我的最终结果 PSNR!
我想得到尽可能接近的结果to this one!
到目前为止我尝试了什么!
我试过只在颜色通道中添加噪点。
将输入图像转换为 YUV 颜色 space
仅在 UV 颜色通道中添加噪声并保持 Y 通道不变。
结果非常糟糕,图像的整体颜色发生了变化!如果需要,将添加代码!
非常感谢任何有关此的建议!可以给我一些为图像添加噪点的公式!
看起来您的噪声矩阵无法获得负值,因为它具有 unsigned char 元素类型。尝试使用实值矩阵进行运算,应该会有帮助。
谢谢@Andrey Smorodov 的见解! 我成功了!这是我在彩色图像中添加噪声的更新代码。希望这对某人有用!
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
using namespace cv;
using namespace std;
inline BYTE Clamp(int n)
{
n = n>255 ? 255 : n;
return n<0 ? 0 : n;
}
bool AddGaussianNoise(const Mat mSrc, Mat &mDst,double Mean=0.0, double StdDev=10.0)
{
if(mSrc.empty())
{
cout<<"[Error]! Input Image Empty!";
return 0;
}
Mat mGaussian_noise = Mat(mSrc.size(),CV_16SC3);
randn(mGaussian_noise,Scalar::all(Mean),Scalar::all(StdDev));
for (int Rows = 0; Rows < mSrc.rows; Rows++)
{
for (int Cols = 0; Cols < mSrc.cols; Cols++)
{
Vec3b Source_Pixel= mSrc.at<Vec3b>(Rows,Cols);
Vec3b &Des_Pixel= mDst.at<Vec3b>(Rows,Cols);
Vec3s Noise_Pixel= mGaussian_noise.at<Vec3s>(Rows,Cols);
for (int i = 0; i < 3; i++)
{
int Dest_Pixel= Source_Pixel.val[i] + Noise_Pixel.val[i];
Des_Pixel.val[i]= Clamp(Dest_Pixel);
}
}
}
return true;
}
bool AddGaussianNoise_Opencv(const Mat mSrc, Mat &mDst,double Mean=0.0, double StdDev=10.0)
{
if(mSrc.empty())
{
cout<<"[Error]! Input Image Empty!";
return 0;
}
Mat mSrc_16SC;
Mat mGaussian_noise = Mat(mSrc.size(),CV_16SC3);
randn(mGaussian_noise,Scalar::all(Mean), Scalar::all(StdDev));
mSrc.convertTo(mSrc_16SC,CV_16SC3);
addWeighted(mSrc_16SC, 1.0, mGaussian_noise, 1.0, 0.0, mSrc_16SC);
mSrc_16SC.convertTo(mDst,mSrc.type());
return true;
}
int main(int argc, const char* argv[])
{
Mat mSource= imread("input.png",1);
imshow("Source Image",mSource);
Mat mColorNoise(mSource.size(),mSource.type());
AddGaussianNoise(mSource,mColorNoise,0,10.0);
imshow("Source + Color Noise",mColorNoise);
AddGaussianNoise_Opencv(mSource,mColorNoise,0,10.0);//I recommend to use this way!
imshow("Source + Color Noise OpenCV",mColorNoise);
waitKey();
return 0;
}
主要有两种方法可以将awgn噪声(平均值= 0,标准差= 30)添加到彩色图像中。
首先:可以独立的给红绿蓝各通道(或其他任何颜色model-HSI、YUV、Lab)添加均值=0,标准差=30的awgn噪声;然后结合噪声通道形成彩色噪声图像。
第二种:使用in-built函数直接给彩色图像加噪点。例如。 Matlab 中的 imnoise()。
我尝试了两种方法(imnoise 和 independently),我得到了相同的结果。
您提到“我尝试只在颜色通道中添加噪点。 将输入图像转换为 YUV 颜色 space 仅在 UV 颜色通道中添加噪声并保持 Y 通道不变。"
如果你使用的是YUV颜色模型,我建议你反其道而行之。保持 U 和 V 通道不变,仅向 Y 通道添加噪声。