在OpenCvC++中生成噪声图像,受泊松和散斑噪声破坏

2024-09-30 20:37:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试了谷歌,但没有找到任何C++代码来产生带有泊松和斑点噪声的噪声图像。虽然,我在Python中得到了一个代码,并试图将它转换成C++。 https://stackoverflow.com/a/30624520/3465857 请看一下,我不确定是否正确。在

  Mat& addPoissonNoiseIntoImage(Mat& src){
        unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
        static Mat noisyImg = src.clone();
        std::default_random_engine generator (seed);
        std::vector<float> uniqueValsOfMat = BasicAlgo::getInstance()->uniqueValuesInMat(src);
        unsigned long int val = uniqueValsOfMat.size();
        float vals = pow(2, (ceil(log2(val))));
        for(int i = 0; i < src.rows; i++)
        {
            for(int j = 0; j < src.cols; j++){
                float pixelVal = (double)(src.at<uchar>(i,j));
                pixelVal = pixelVal * vals;
                std::poisson_distribution<int> distribution (pixelVal);
                float generatedVal = distribution(generator) / float(vals);
                noisyImg.at<uchar>(i,j) = generatedVal;
            }
        }
        return noisyImg;
    }

    Mat& addSpeckleNoiseIntoImage(Mat& src, float mean, float std ){
        unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
        static Mat noisyImg = src.clone();
        std::default_random_engine generator (seed);
        std::normal_distribution<double> distribution (mean,std);
        for(int i = 0; i < src.rows; i++)
        {
            for(int j = 0; j < src.cols; j++){
                float pixelVal = (double)(src.at<uchar>(i,j));
                while(true){
                    float vals = distribution(generator);
                    pixelVal = pixelVal + pixelVal * vals;
                    if( (pixelVal > 0) && (pixelVal < 256) )
                        break; // you got the right pixel value, so break
                }
                noisyImg.at<uchar>(i,j) = pixelVal;
            }
        }
        return noisyImg;
    }

要在Mat中查找唯一值:

^{pr2}$

我不确定生成泊松和散斑噪声的代码是否正确。请看一下。在


Tags: 代码srcforfloatgeneratoratdistributionint