高斯噪聲
影象常常受到一些隨機誤差的影響而退化,我們通常稱這個退化為噪聲。在影象的捕獲、傳輸或者處理過程中都有可能產生噪聲,噪聲可能是依賴於影象內容,可能無關。
噪聲一般由其頻率的特徵來刻畫,理想的噪聲稱為白噪聲,高斯噪聲就屬於白噪聲的一種,為白噪聲的一個特例。服從高斯(正態)分佈,在一維的情況下,概率密度函式為
Line"/>
加性噪聲,在影象通過訊號傳輸的時候,產生的噪聲一般與影象訊號無關,這種獨立於訊號的退化稱為加性噪聲,模型表示為

程式碼實現
#include<opencv2/opencv.hpp> #include <random> namespace mycv { const double pi = 3.1415926; void createGaussianNoise(cv::Mat& src, cv::Mat& dst) { dst = src.clone(); //1、灰階範圍[0, G - 1], 取sigma > 0; sigma越小噪聲越小 const int G = 256; double sigma = 20; for(int i = 0; i < src.rows; ++i) for (int j = 0; j < src.cols - 1; ++j) { //2、產生位於[0, 1]獨立隨機數gamma、phi std::random_device rd; std::mt19937 gen(rd()); double gamma = std::generate_canonical<double, 2>(gen); double phi = std::generate_canonical<double, 2>(gen); //3、計算z1、z2 double z1 = sigma * std::cos(2 * pi*phi)*std::sqrt(-2 * std::log(gamma)); double z2 = sigma * std::sin(2 * pi*phi)*std::sqrt(-2 * std::log(gamma)); //4、 double tmpxy = src.at<uchar>(i, j) + z1; double tmpxy1 = src.at<uchar>(i, j + 1) + z2; //5 if (tmpxy < 0) dst.at<uchar>(i, j) = 0; else if (tmpxy > G - 1) dst.at<uchar>(i, j) = G - 1; else dst.at<uchar>(i, j) = static_cast<int>(tmpxy); if (tmpxy1 < 0) dst.at<uchar>(i, j + 1) = 0; else if (tmpxy > G - 1) dst.at<uchar>(i, j + 1) = G - 1; else dst.at<uchar>(i, j + 1) = static_cast<int>(tmpxy1); } } }//mycv int main(void) { cv::Mat src = cv::imread("lena.jpg", 0); if (src.empty()) return -1; cv::Mat dst; mycv::createGaussianNoise(src, dst); cv::imshow("src", src); cv::imshow("dst", dst); cv::waitKey(0); return 0; }//main