天天看點

數字圖像處理:噪聲模型(椒鹽噪聲、随機噪聲、高斯噪聲)和濾波方法

圖像噪聲是圖像在擷取或傳輸過程中受到随機信号幹擾,妨礙人們對圖像了解及分析的信号。很多時候将圖像噪聲看作多元随機過程,因而描述噪聲的方法完全可以借用随機過程的描述,即使用其機率分布函數和機率密度分布函數。圖像噪聲的産生來自圖像擷取中的環境條件和傳感元器件自身的品質,圖像在傳輸過程中産生圖像噪聲的主要因素是所用的傳輸信道受到噪聲污染。

一、噪聲類型

1、椒鹽噪聲(鹽=白色,椒=黑色)

椒鹽噪聲是數字圖像中的常見噪聲,一般是由圖像傳感器、傳輸信道及解碼處理等産生的黑白相見的亮暗點噪聲,椒鹽噪聲常由圖像切割産生。椒鹽噪聲是指兩種噪聲:鹽噪聲(salt noise)及椒噪聲(pepper noise)。鹽噪聲一般是白色噪聲,椒噪聲一般是黑色噪聲,前者高灰階噪聲,後者屬于低灰階噪聲,一般兩種噪聲同時出現,呈現在圖像上就是黑白雜點。圖像去除脈沖幹擾及椒鹽噪聲最常用的算法是中值濾波,圖像模拟添加椒鹽噪聲是通過随機擷取像素值點并設定為高亮點來實作的。

2.随機噪聲

随機噪聲,又稱背景噪聲,由時間上随機産生的大量起伏騷擾積累而造成的,其值在給定瞬間内不能預測的噪聲。說實話沒大了解,後來在老師的ppt課件上發現了随機值脈沖噪聲,感覺它的效果和椒鹽噪聲很像。又百度了一下,發現脈沖噪聲的特點是無規則。于是本算法基本和椒鹽噪聲的實作相似,可以控制噪聲數量,随機生成黑白雜點,但此黑白雜點也是随機色值(a,b,c)(255-a,255-b,255-c),其中a,b,c是0-30的随機數,這些雜點在圖像坐标内随機分布。

3.高斯噪聲

高斯噪聲是指機率密度函數服從高斯分布(即正态分布)的一類噪聲。如果一個噪聲,它的幅度服從高斯分布,而它的功率譜密度又是分布均勻的,則稱它為高斯白噪聲。高斯白噪聲的二階矩不想關,一階矩為常數,是指先後信号在時間上的相關性。高斯白噪聲包括熱噪聲和散粒噪聲。高斯噪聲完全由其時變平均值和兩瞬時的協方差函數來确定,若噪聲為平穩的,則平均值與時間無關,而協方差函數則變成僅和所考慮的兩瞬時之方差有關的相關函數,它在意義上等效于功率譜密度。高斯噪聲可以由大量獨立的脈沖産生,進而在任何有限時間間隔内,這些脈沖中的每一個脈沖值與所有脈沖值的總和相比都可以忽略不計。

二、濾波

常見的濾波方式有均值濾波、中值濾波、高斯濾波等。

1、均值濾波—mean_image

      均值濾波又稱作鄰域平均法,是典型的線性濾波算法,理想的均值濾波是用每個像素和它周圍像素計算出來的平均值替換圖像中每個像素。

      從頻率域觀點來看均值濾波是一種低通濾波器(讓圖像的低頻部分通過,通常弱化邊緣,會得到比較平緩的圖像),高頻信号将會去掉,是以可以幫助消除圖像尖銳噪聲,實作圖像平滑,模糊等功能。因為此方法不能很好地保護圖像細節,在圖像去噪的同時也破壞了圖像的細節部分,進而使圖像變得模糊。采樣Kernel資料通常是3X3的矩陣,如下表示:

數字圖像處理:噪聲模型(椒鹽噪聲、随機噪聲、高斯噪聲)和濾波方法

      從左到右從上到下計算圖像中的每個像素,最終得到處理後的圖像。均值濾波可以加上兩個參數,即疊代次數,Kernel資料大小。一個相同的Kernel,但是多次疊代就會效果越來越好。同樣,疊代次數相同,Kernel矩陣越大,均值濾波的效果就越明顯。

優勢:消除尖銳噪聲,實作圖像平滑,模糊等功能。

2、中值濾波—median_Image,适用于椒鹽噪聲

      中值濾波也是消除圖像噪聲最常見的手段之一,特别是消除椒鹽噪聲,中值濾波的效果要比均值濾波更好。它的基本原理是計算出數字圖像中的一點的一個鄰域中的各點值的中值(中間值),并使用該中值将将該點原值代替。可以了解為使用一個視窗沿圖像移動,用視窗内所有象素灰階的中值來代替視窗中心位置的象素灰階。視窗根據需要定義,可以是3* 3,5 *5的方形、十字形或者圓形等。

數字圖像處理:噪聲模型(椒鹽噪聲、随機噪聲、高斯噪聲)和濾波方法

優勢:消除椒鹽噪聲。

3、高斯濾波—gauss_image,适用于高斯噪聲

      高斯濾波是一種線性平滑濾波,适用于消除高斯噪聲,廣泛應用于圖像處理的減噪過程。通俗的講,高斯濾波就是對整幅圖像進行權重平均的過程,每一個像素點的值,都由其本身和鄰域内的其他像素值經過權重平均後得到。可以了解為用一個模闆(或稱卷積、掩模)掃描圖像中的每一個像素,用模闆确定的鄰域内像素的權重平均灰階值去替代模闆中心像素點的值。

優勢:消除高斯噪聲。

産生原因:

圖像傳感器在拍攝時市場不夠明亮、亮度不夠均勻;

電路各元器件自身噪聲和互相影響;

圖像傳感器長期工作,溫度過高。

三、舉例

1、halcon示例

*中值濾波,去除椒鹽噪聲
read_image (Image, 'D:/hellowprld/2/OtherSquare_1.jpg')
*彩色轉灰階圖
count_channels (Image, Channels)
if (Channels == 3 or Channels == 4)
    rgb1_to_gray (Image, Image)
endif
*因為邊界處往往無法移動濾波視窗,是以需要對像素做補充.
*'continued'表示延伸邊界像素
*'cyclic'表示循環延伸邊界像素
median_image (Image, ImageMedian, 'circle', 3, 'continued')
median_image (Image, ImageMedian2, 'circle', 3, 'cyclic')
dev_display (ImageMedian)
write_image (ImageMedian, 'jpeg 100', 0, 'D:/hellowprld/2/medianBlur.jpg')
stop()      

2、opencv中提供了medianBlur()函數實作了中值濾波操作,其原型如下:

void medianBlur(InputArray src, OutputArray dst, int ksize)

參數解釋:

InputArray src: 輸入圖像,圖像為1、3、4通道的圖像,當模闆尺寸為3或5時,圖像深度隻能為CV_8U、CV_16U、CV_32F中的一個,如而對于較大孔徑尺寸的圖檔,圖像深度隻能是CV_8U。

OutputArray dst: 輸出圖像,尺寸和類型與輸入圖像一緻,可以使用Mat::Clone以原圖像為模闆來初始化輸出圖像dst。

int ksize: 濾波模闆的尺寸大小,必須是大于1的奇數,如3、5、7……

Mat SrcImage;
Mat DstImage;
int nkernelSize = 3;
medianBlur(SrcImage, DstImage, nkernelSize);      

opencv完整版源碼:

int main(int argc, char** argv)
{
    Mat SrcImage = imread("D:\\hellowprld\\2\\4.jpg", IMREAD_GRAYSCALE);
    int h = SrcImage.rows;
    int w = SrcImage.cols;
    if (h == 0 || w == 0)
    {
  return -1;
    }
    namedWindow("input", WINDOW_NORMAL);
    imshow("input", SrcImage);
    Mat DstImage;
    int nkernelSize = 3;
    cv::medianBlur(SrcImage, DstImage, nkernelSize);
    namedWindow("output", WINDOW_NORMAL);
    imshow("output", DstImage);
    imwrite("medianBlur.jpg", DstImage);
    waitKey(0);
}      

---

參考文獻:

http://blog.sina.com.cn/s/blog_159aff7940102xcme.html https://blog.csdn.net/u013033431/article/details/50907806 https://blog.csdn.net/weixin_43197380/article/details/91045946

繼續閱讀