1. 程式人生 > >0025-給影象新增椒鹽噪聲之後用均值濾波和中值濾波過濾影象!

0025-給影象新增椒鹽噪聲之後用均值濾波和中值濾波過濾影象!

椒鹽噪聲是椒噪聲和鹽噪聲的合稱,它是由影象感測器,傳輸通道,解碼處理等產生的黑白相間的亮暗點噪聲,去除椒鹽噪聲的最常用演算法是中值濾波,在去除椒鹽噪聲的效果上均值濾波不如中值濾波,本文所給的程式碼會證明這個結論。

首先說下怎麼給影象加上椒噪聲和鹽噪聲。我們可以利用C++的srand函式和rand函式來產生隨機座標,並把這些座標置為椒噪聲點或鹽噪聲點。
這兩個函式的用法就不多說了,大家可自行搜尋下網上的資源,再結合程式碼大家很容易知道怎麼用。值得一提的是rand函式的範圍為0至RAND_MAX,是整數,RAND_MAX的值在stdlib.h中有定義,定義如下:
#define RAND_MAX 0x7fff

在本文的程式碼中,鹽噪聲的BGR值為(250,150,250),椒噪聲的BGR值為(250,150,50)

再來說均值濾波和中值濾波
均值濾波:它是用某點鄰域視窗內的的所有畫素的平均值來代替錨點處的值。它不能很好地保護影象細節,在影象去噪的同時也破壞了影象的細節部分,從而使影象變得模糊,不能很好地去除噪聲點。
中值濾波:中值濾波法是一種非線性平滑技術,它將每一畫素點的灰度值設定為該點某鄰域視窗內的所有畫素點灰度值的中值。

OpenCV提供了函式medianBlur和函式blur來實現均值濾波和中值濾波,這兩個函式的使用方法簡單,沒必要作過多的說明,唯一需要說明白是這兩個函式的第三個引數均需提供核算子的大小,關於“核算子”的概念,大家可參考博文

https://blog.csdn.net/lehuoziyuan/article/details/84101788

程式碼如下

影象處理開發資料、影象處理開發需求、影象處理接私活掙零花錢,可以搜尋公眾號"qxsf321",並關注!
程式碼中用到的影象下載連結:http://pan.baidu.com/s/1kUI2NAn 密碼:nu5t

//opencv版本:OpenCV3.0
//VS版本:VS2013
//Author:qxsf321.net

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>    
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <time.h>  
#include <iostream>

using namespace cv;
using namespace std;

void ColorSalt(Mat& image, int n)//本函式加入彩色鹽噪聲  
{
        srand((unsigned)time(NULL));
        for (int k = 0; k<n; k++)//將影象中n個畫素隨機置零  
        {
                int i = rand() % image.cols;
                int j = rand() % image.rows; RAND_MAX
                //將影象顏色隨機改變  
                image.at<Vec3b>(j, i)[0] = 250;
                image.at<Vec3b>(j, i)[1] = 150;
                image.at<Vec3b>(j, i)[2] = 250;
        }
}

void ColorPepper(Mat& image, int n)//本函式加入彩色椒噪聲  
{
        srand((unsigned)time(NULL));
        for (int k = 0; k<n; k++)
        {
                int i = rand() % image.cols;
                int j = rand() % image.rows;
                //將影象顏色隨機改變  
                image.at<Vec3b>(j, i)[0] = 250;
                image.at<Vec3b>(j, i)[1] = 150;
                image.at<Vec3b>(j, i)[2] = 50;
        }
}

int main()
{
        //源影象  
        Mat scr = imread("qiu_ye.jpg");
        Mat dst;
        Mat img = scr.clone();
        Mat img1 = scr.clone();

        cout << scr.channels() << " " << scr.type() << "  " << scr.depth();
        imshow("原影象", scr);

        ColorSalt(scr, 5000);  //加入白鹽噪聲  
        ColorPepper(scr, 1000); //加入黑椒噪聲  
        imshow("帶噪聲的影象", scr);

        medianBlur(scr, dst, 3);  //中值濾波,核算子大小為3,錨點為預設的中間點
        imshow("中值濾波結果", dst);

        ColorSalt(img, 5000);
        ColorPepper(img, 1000);
        blur(img, dst, Size(3, 3));//均值濾波,核算子大小為3,錨點為預設的中間點
        imshow("均值濾波結果", dst);

        waitKey(0);
        return EXIT_SUCCESS;
}


執行結果截圖如下

從截圖中我們可以看出,對於椒鹽噪聲,中值濾波的效果優於均值濾波。