Как добавить шум к цветному изображению-Opencv
Я пытаюсь добавить шум к изображению, а затем Денуазировать его, чтобы проверить мой алгоритм шумоподавления! Поэтому для бенчмарка я имею в виду этоонлайн-тестовые образцы . Я пытаюсь воспроизвести модель шума.
Со ссылкой на этот поток 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!
Я хочу получить результаты как можно ближе к этому !
Что я пробовал до сих пор!
Я попытался добавить шум только в цветовой канал.
- преобразование входного изображения в цветовое пространство YUV
-
Добавьте шум только в УФ-цветовых каналах и сохраните Y-канал неизменным.
Результаты очень плохие & общий цвет изображения меняется! Добавлю код, если понадобится!
Так что любой совет относительно этого очень ценится! Может быть, вы дадите мне несколько формул для добавления шума к изображению!
2 ответа:
Похоже, что ваша матрица шума не может получить отрицательные значения, так как она имеет беззнаковый тип элемента char. Попробуйте оперировать с реальными ценными матрицами, это должно помочь.
Спасибо @Андрей смороду за ваши идеи! Я получил это работает! Вот мой обновленный код для добавления шума в цветное изображение. Надеюсь, это кому-то пригодится!
#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; }