How to add Noise to Color Image - Opencv

后端 未结 4 1611
别跟我提以往
别跟我提以往 2021-01-14 06:27

I\'m trying to to add noise to an Image & then Denoise it to test my DeNoising algorithm! So for benchmark i\'m referring this Online Test samples. I\'m trying to replic

4条回答
  •  天命终不由人
    2021-01-14 07:12

    Thank you @Andrey Smorodov For your insights! I got it working! Here is my updated code for adding Noise in a Color Image. Hope this will be useful for someone!

    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/highgui/highgui.hpp"
    
    #include 
    
    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(Rows,Cols);
                Vec3b &Des_Pixel= mDst.at(Rows,Cols);
                Vec3s Noise_Pixel= mGaussian_noise.at(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;
    }  
    

提交回复
热议问题