總結學習下圖像處理方面基礎知識。
這是第一篇,簡單的介紹下使用 OpenCV 的三個基本功能:
? 圖像的讀取? 圖像的顯示? 訪問圖像的像素值
然后概述下圖像噪聲的類型,并為圖像添加兩種常見的噪聲:高斯噪聲和椒鹽噪聲。最后,使用中值濾波和均值濾波來處理帶有噪聲的圖像。
OpenCV 基礎
在 OpenCV 中,完成圖像的輸入輸出以及顯示,只需要以下幾個函數:
1. namedWindow
創建一個可以通過其名字引用的窗口。第一個參數,設置窗口的 name,可以通過name引用該窗口;第二個參數,設置窗口的大小。有以下幾個選擇:
? WINDOW_NORMAL or WINDOW_AUTOSIZE 調整窗口的大小以適應圖像,不同的是,使用WINDOW_NORMAL可以手動調整窗口的大小;WINDOW_AUTOSIZE不能調整窗口的大小。? WINDOW_FREERATIO or WINDOW_KEEPRATIO 改變窗口時是否會保持圖像的ratio不變,沒發現這倆有什么區別。
2. imshow
顯示圖像
3. imread
讀取圖像數據到Mat中,第一個參數是圖像的文件名;第二個參數是標志,標識怎么處理圖像的色彩。常用的幾個選項:
? IMREAD_UNCHANGED 和原圖像保持一直不變? IMREAD_GRAYSCALE 將圖像轉換為單通道的灰度圖? IMREAD_COLOR 將圖像轉換為3通道的BGR,默認選項? IMREAD_REDUCED_GRAYSCALE_2 IMREAD_REDUCED_GRAYSCALE_4 IMREAD_REDUCED_GRAYSCALE_8 單通道灰度圖讀入圖像,并減小圖像的大小。減小的值為1/2,1/4,1/8? IMREAD_REDUCED_COLOR_2 IMREAD_REDUCED_COLOR_4 IMREAD_REDUCED_COLOR_2 3通道BGR讀入圖像,并減小圖像的大小。減小的值為1/2,1/4,1/8
4. Mat
Mat 是 OpenCV 中最重要的數據結構,在做圖像處理時基本都是對該結構體的操作。
Mat 由兩部分構成:矩陣頭和矩陣數據,矩陣頭較小,創建的每個 Mat 實例都擁有一個矩陣頭,而矩陣數據通常占有較大的空間,OpenCV 中通過引用計數來管理這部分內存空間,當調用賦值運算符和拷貝構造函數時,并不會只復制矩陣頭,并不會復制矩陣數據,只是將其的引用計數加1。例如:
上面代碼中的 a,b 和 m 各自擁有自己的矩陣頭,其引用的數據卻指向同一份。也就是說,修改了其中任意一個,都會影響到其余的兩個。
要想復制矩陣數據,可以調用 clone 和 copyTo 這兩個函數
將圖像讀入到 Mat 后,有三種方式訪問 Mat 中的數據:
? 通過指針? 使用迭代器? 調用 at
圖像噪聲
圖像噪聲是圖像在獲取或傳輸的過程中受到隨機信號的干擾,在圖像上出現的一些隨機的、離散的、孤立的像素點,這些點會干擾人眼對圖像信息的分析。圖像的噪聲通常是比較復雜的,很多時候將其看成是多維隨機過程,因而可以借助于隨即過程描述噪聲,即使用概率分布函數和概率密度函數。
圖像的噪聲很多,性質也千差萬別, 可以通過不同的方法給噪聲分類。
按照產生的原因:
? 外部噪聲? 內部噪聲
這種分類方法,有助于理解噪聲產生的源頭,但對于降噪算法只能起到原理上的幫組。
噪聲和圖像信號的關系,可以分為:
? 加性噪聲,加性噪聲和圖像信號強度不相關,這類噪聲可以看著理想無噪聲圖像f和噪聲的和。? 乘性噪聲,乘性噪聲和圖像信號是相關的,往往隨圖像信號的變化而變化
而為了分析處理的方便,常常將乘性噪聲近似認為是加性噪聲,而且總是假定信號和噪聲是互相獨立的。
最重要的來了,按照概率密度函數(PDF)分類:
? 高斯噪聲,高斯噪聲模型經常被用于實踐中。? 脈沖噪聲(椒鹽噪聲),圖像上一個個點,也可稱為散粒和尖峰噪聲。? 伽馬噪聲? 瑞利噪聲? 指數分布噪聲? 均勻分布噪聲
這種分類方法,引入了數學模型,對設計過濾算法比較有幫助。
給圖像添加噪聲
按照指定的噪聲類型,生成一個隨機數,然后將這個隨機數加到源像素值上,并將得到的值所放到[0,255]區間即可。
C++11 隨機數發生器
新的隨機數生成器被抽象成了兩個部分:隨機數生成引擎和要生成的隨機數符合的分布。
隨機數引擎有三種:
? linear_congruential_engine 線性同余算法? mersenne_twister_engine 梅森旋轉算法? subtract_with_carry_engine 帶進位的線性同余算法
第一種最常用,而且速度比較快;第二種號稱最好的偽隨機數生成器
添加圖像噪聲
使用C++的隨機數發生器為圖像添加兩種噪聲:椒鹽噪聲和高斯噪聲。椒鹽噪聲是圖像中離散分布的白點或者黑點,其代碼如下:
上述代碼中使用ptr()獲取圖像某一行的行首指針,得到行首指針后就可以任意的訪問改行的像素值。
高斯噪聲是一種加性噪聲,為圖像添加高斯噪聲的代碼如下:
隨機產生符合高斯分布的隨機數,然后將該值和圖像原有的像素值相加,并將得到的和壓縮到[0,255]區間內。
左邊是原圖,中間的是添加高斯噪聲后的圖像,最右邊的是添加椒鹽噪聲后的圖像。
使用濾波器去除噪聲
根據噪聲類型的不同,選擇不同的濾波器過濾掉噪聲。通常,對于椒鹽噪聲,選擇中值濾波器(Median Filter),在去掉噪聲的同時,不會模糊圖像;對于高斯噪聲,選擇均值濾波器(Mean Filter),能夠去掉噪聲,但會對圖像造成一定的模糊。
在 OpenCV 中,對應于均值濾波器的函數是 blur,該函數需要5個參數,通常只設置前3個后兩個使用默認值即可。blur(m, m2, Size(5, 5));第一個參數是輸入的圖像,第二個參數是輸出的圖像,第三個參數是濾波器的大小,這里使用的是5×55×5的矩形。
對應于中值濾波器的函數是medianBlur(m1, m3, 5);前兩個參數是輸入輸出的圖像,第三個參數是濾波器的大小,由于是選取的是中值,濾波器的大小通常是一個奇數。
下圖是對有噪聲圖像使用濾波器后的結果,中間的是原始圖像,左邊的是使用均值濾波器過濾高斯噪聲后的結果;右邊的是使用中值濾波器過濾椒鹽噪聲后的結果。可以明顯的看出,這兩種濾波器都能夠很好的去掉圖像的噪聲,但會對圖像造成一定的模糊,尤其是均值濾波器造成的模糊比較明顯。
總結
本文算是第一篇文章,簡單的介紹下 OpenCV 的基本使用;接著訪問圖像中的像素,并借助于C++11的隨機數庫,為圖像添加高斯噪聲和椒鹽噪聲;最后使用中值濾波器和均值濾波器除去圖像,并對結果進行了對比。
-
噪聲
+關注
關注
13文章
1118瀏覽量
47369 -
圖像處理
+關注
關注
27文章
1281瀏覽量
56638 -
OpenCV
+關注
關注
30文章
628瀏覽量
41260
原文標題:圖像處理基礎(1):噪聲的添加和過濾
文章出處:【微信號:Imgtec,微信公眾號:Imagination Tech】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論