CV:計算機視覺圖像的基礎知識—以python的cv2庫來了解計算機視覺圖像基礎

CV:計算機視覺圖像的基礎知識—以python的cv2庫來了解計算機視覺圖像基礎

 

 

 

目錄

一、圖像中的傅里葉變換

1、時域和頻域

2、傅里葉變換

3、圖像中的傅里葉變換

1、頻域變換

2、時域變換—HPF和LPF

二、圖像去噪經典算法—各種濾波器

0、線性濾波器和非線性濾波器

高斯噪聲和椒鹽噪聲區別

1、均值濾波—像素值取平均值

2、中值濾波—像素值遞增排序取中間:常用來去椒鹽噪聲、斑點噪聲

3、高斯濾波—對整幅圖像像素值進行加權平均

4、雙邊濾波—折中圖像的空間鄰近度和像素值相似度


 

 

相關文章
Py之cv2:cv2庫(OpenCV)的簡介、安裝、使用方法(常見函數、方法等)最強詳細攻略
CV:計算機視覺圖像的基礎知識—以python的cv2庫來了解計算機視覺圖像基礎
CV:計算機視覺圖像的基礎知識—以python的cv2庫來了解計算機視覺圖像基礎—代碼實現
CV:計算機視覺圖像的基礎知識—以python的cv2庫來了解計算機視覺圖像基礎—代碼實現—圖像基礎各種操作(函數及案例)

 

一、圖像中的傅里葉變換

1、時域和頻域

時域:從我們出生,我們看到的世界都以時間貫穿,花開花落、生老病死、雲彩的移動都會隨着時間發生改變。這種以時間作爲參照來觀察動態世界的方法我們稱其爲時域分析

頻域:如果換一個角度觀察世界,這個世界並沒有發生變化。爲什麼呢,原因就是,觀察的角度是頻域,而不是時域。好,來介紹下什麼是頻域。以化學反應爲例子:

         顯而易見,隨着時間的推移,氫氧化鈉與鹽酸最終變成了氯化鈉和水,在時域的角度,反應物發生了變化。在頻域的角度呢,Na+Na+還是Na+Na+,氫原子還是氫原子,本質並沒有發生變化,這就是頻域角度的分析
    而貫穿時域與頻域的方法之一,就是傳中說的傅里葉分析。傅里葉分析可分爲傅里葉級數(Fourier Serie)和傅里葉變換(Fourier Transformation)。

(1)、頻域和時域座標軸
頻域座標軸:函數隨着時間的變化而變化;
時域座標軸:函數始終是這個函數,它本身沒有變化。

 

2、傅里葉變換

          傅大佬告訴我們,任何周期函數,都可以看作是不同振幅A不同相位ψ正弦波的疊加

           比如,可以採用前面說的正弦曲線波,疊加出一個帶90度角的矩形波,中間那部分在逐漸的向正方形逼近。不僅僅是矩形,其他能想到的任何波形,都是可以如此方法用正弦波疊加起來的。

         傅里葉級數的本質是將一個週期的信號分解成無限多分開的(離散的)正弦波,公式如下,OO表示觀察信號,ωω表示頻率,ϕϕ表示相位,AA表示振幅。但是宇宙變換似乎並不是週期的,任何常見事物的變化似乎也不是週期的,比如小姐姐每天的行程如果是週期的,那是不是太好下手了,這樣就違背了自然規律。 

        傅大佬變化到底幹嘛呢?當然是貫穿時域和頻域的一種分析手段,實際上是對一個週期無限大的函數進行變換,將一個時域非週期的連續信號,轉換爲一個在頻域非週期的連續信號。

         舉個栗子:對於鋼琴來說,
時域:離散的按鍵信號變成了連續的信號,就是動聽的音樂。
頻域:每一次的震動連續起來也就成了連續的信號,從離散譜變成了連續譜。原來離散譜的疊加,變成了連續譜的累積,所以在計算上也從求和符號變成了積分符號。

 

3、圖像中的傅里葉變換

        上述的例子是一維信號的傅里葉變換,並且信號是連續的。我們知道圖像是二維離散的,連續與離散都可以用傅里葉進行變換,那麼二維信號無非就是在xx方向與yy方向都進行一次一維的傅里葉變換得到。這麼看來,可以想象,它的時域構成就是一個網格矩陣了,橫軸從11到nn,縱軸也是這樣,所有圖像的時域構成都認爲是這樣的。頻域呢,當然同上,也會得到有關頻域的網格矩陣。

       離散的二維傅里葉變換,一個圖像爲M×N的圖像f(x,y)進過離散傅里葉變換得到F(u,v),那麼一般的公式爲:F(u,v)是頻域,f(x,y)是時域:

                  

 

連續傅里葉變換

F(\mu,\nu)=\int_{-\infty }^{\infty}\int_{-\infty }^{\infty}f(t,z)e^{-j*2\pi [\mu t+\nu z]]}dtdz

f(t,z)=\int_{-\infty }^{\infty}\int_{-\infty }^{\infty}F(\mu,\nu)e^{j*2\pi [\mu t+\nu z]]}d\mu d\nu

離散傅里葉變換

F(\mu,\nu)=\Sigma \Sigma f(x,y)e^{-j*2\pi [\frac{\mu x}{m}+\frac{\nu y}{n}]]}

f(x,y) =\frac{1}{MN} \Sigma \Sigma F(\mu,\nu) e^{j*2\pi [\frac{\mu x}{m}+\frac{\nu y}{n}]]}

 

 

1、頻域變換

       將複雜的時間信號或空間信號變換成以頻率成分表示的結構形式就是頻域變換。
譜圖:頻域變換以直角座標形式表示,得到的圖形就是常說的譜圖。頻譜是總稱,視頻率成分的具體內容還有幅值譜、相位譜、功率譜、能量譜、倒頻譜等類型。實現頻譜變換的數學原理是傅立葉變換。
幅度譜:通過傅里葉變化來介紹圖像的幅度譜,幅度譜呈現了原始圖像在變化方面的一種表示:圖像最明亮的像素放到中央,然後逐漸變暗,在邊緣上的像素最暗,這樣可以發現圖像中亮、暗像素的百分比。(即爲頻域中的振幅AA的強度)。
        Numpy有一個FFT(快速傅里葉變換)包來完成這個工作,np.fft.fft2()爲我們提供了一個複雜數組的頻率轉換,即一幅圖像的離散傅里葉變換。如果沒有參數傳遞,輸出數組的大小將與輸入相同。

  • 第一個參數是輸入圖像,它是灰度圖像。
  • 第二個參數是可選的,它決定了輸出數組的大小。如果它大於輸入圖像的大小,則輸入圖像在計算FFT之前填充了0。如果它小於輸入圖像,輸入圖像將被裁剪。

          可以在中心看到更多的白色區域,表示低振幅的波佔到了多數,高振幅的波佔少數,而且說明了波的整體頻率偏低。因爲在波形的調控中,需要較多的直線和近似直線的波來調整。低頻波越多,也就是有較多的波近似於直線,也就是,這些波的頻率很慢,ω很小。

s1 = np.log(np.abs(fshift))     #取絕對值:將複數變化成實數取對數的目的爲了將數據變化到0-255
         採用log函數去映射—而非均值歸一化:而不是採取以下的歸一化的形式去用,因爲矩陣的元素,絕大多數的像素數值都很小,如果採用以下的形式去歸一化,絕大多數的數值均很小,會得到一個黑色的圖像,歸一化這種東西本來就是建模裏面一個不好掌控的度。

 

import cv2
import numpy as np
import matplotlib.pyplot as plt
 
img = cv2.imread('F:/File_Python/Resources/face_images/ZLY01.jpg', 0) #直接讀爲灰度圖像
img_fft = np.fft.fft2(img)            #做頻率變換
img_fft_fshift = np.fft.fftshift(img_fft)     #轉移像素做幅度普
img_fft_fshift_log = np.log(np.abs(img_fft_fshift))     #取絕對值:將複數變化成實數取對數的目的爲了將數據變化到0-255


plt.subplot(121)
plt.imshow(img, 'gray')
plt.title('original')
 
plt.subplot(122)
plt.imshow(img_fft_fshift_log,'gray')
plt.title('center')
 
plt.show()

 

2、時域變換—HPF和LPF

        進行時域變換,比如高通濾波器。爲此,你只需用一個矩形窗口大小,來移除低頻部分(頻率ω越大,震動越明顯),即保留下圖像中最有用的信息。那麼圖像中的什麼位置的頻率比較高呢,顯而易見,邊界處。爲什麼呢,在非交界處,你的波可以慢慢悠悠的抖動來顯示信息。在交界處,沒有快速的抖動,怎麼去顯示差異呢?

1、高通濾波器(HPF)—用於檢測邊緣

        High Pass Filter,是檢測圖像的某個區域,然後根據像素與周圍像素的差值提升該像素亮度的濾波器。矩陣的卷積結果,邊界的值越來越大,旁邊的值越來越小,也就是,能夠檢測邊緣

import cv2
import numpy as np
import matplotlib.pyplot as plt

kernel_9 = np.array([[-1, -1, -1],
                     [-1, 8, -1],
                     [-1, -1, -1]])

kernel_25 = np.array([[-1, -1, -1, -1, -1],
                      [-1, 1, 2, 1, -1],
                      [-1, 2, 4, 2, -1],
                      [-1, 1, 2, 1, -1],
                      [-1, -1, -1, -1, -1]])

img = cv2.imread('F:/File_Python/Resources/face_images/ZLY01.jpg')
ndimg = np.array(img)



k3 = cv2.filter2D(ndimg, -1, kernel_9)      #convolve calculate 
k5 = cv2.filter2D(ndimg, -1, kernel_25)     #the second parameters measns the deepth of passageway.
#such as cv2.CV_8U means every passageway is 8 bit.
#-1 means the passageway of the source file and the object file is equal.



plt.subplot(131)
plt.imshow(img)
plt.title("source image")

plt.subplot(132)
plt.imshow(k3)
plt.title("kernel = 3")

plt.subplot(133)
plt.imshow(k5)
plt.title("kernel = 5")

plt.show()

2、低通濾波器(LPF)—去噪和模糊化

        與高通濾波器相反的還有低通濾波器(LPF),低筒濾波器與高通濾波器相反,當一個像素與周圍像素的插值小於一個特定值時,平滑該像素的亮度,用於去噪和模糊化
(1)、比如PS軟件中的高斯模糊,就是常見的模糊濾波器之一,屬於削弱高頻信號的低通濾波器。中間的圖爲高通濾波,最右方的圖爲模糊化後的。

import cv2
import numpy as np
import matplotlib.pyplot as plt

kernel_25h = np.array([[-1, -1, -1, -1, -1],
                      [-1, 1, 2, 1, -1],
                      [-1, 2, 4, 2, -1],
                      [-1, 1, 2, 1, -1],
                      [-1, -1, -1, -1, -1]])

kernel_25l = np.array([[0.04, 0.04, 0.04, 0.04, 0.04],
                      [0.04, 0.04, 0.04, 0.04, 0.04],
                      [0.04, 0.04, 0.04, 0.04, 0.04],
                      [0.04, 0.04, 0.04, 0.04, 0.04],
                      [0.04, 0.04, 0.04, 0.04, 0.04]])

img = cv2.imread('F:/File_Python/Resources/face_images/ZLY01.jpg')
ndimg = np.array(img)

k3 = cv2.filter2D(ndimg, -1, kernel_25h)
k5 = cv2.filter2D(ndimg, -1, kernel_25l)

plt.subplot(131)
plt.imshow(img)
plt.title("source image")

plt.subplot(132)
plt.imshow(k3)
plt.title("kernel5hpf")

plt.subplot(133)
plt.imshow(k5)
plt.title("kernel5lpf")
plt.show()

 

 

二、圖像去噪經典算法—各種濾波器

         圖像濾波,即在儘量保留圖像細節特徵的條件下對目標圖像的噪聲進行抑制,是圖像預處理中不可缺少的操作,其處理效果的好壞將直接影響到後續圖像處理和分析的有效性和可靠性。消除圖像中的噪聲成分叫作圖像的平滑化或濾波操作。

1、濾波器:一種形象的比喻法是:我們可以把濾波器想象成一個包含加權係數的窗口,當使用這個濾波器平滑處理圖像時,就把這個窗口放到圖像之上,透過這個窗口來看我們得到的圖像。
        舉一個濾波在我們生活中的應用:美顏的磨皮功能。如果將我們臉上坑坑窪窪比作是噪聲的話,那麼濾波算法就是來取出這些噪聲,使我們自拍的皮膚看起來很光滑。

2、圖像濾波的兩個目的—提取特徵+清除噪聲
(1)、抽出對象的特徵作爲圖像識別的特徵模式;
(2)、爲適應圖像處理的要求,消除圖像數字化時所混入的噪聲。

3、濾波處理的兩個要求:無損信息+圖像清晰
(1)、不能損壞圖像的輪廓及邊緣等重要信息;
(2)、使圖像清晰視覺效果好。

4、圖像平滑的兩類目的—模糊+消除噪音
        平滑濾波是低頻增強的空間域濾波技術。空間域的平滑濾波,一般採用簡單平均法進行,就是求鄰近像元點的平均亮度值。鄰域的大小與平滑的效果直接相關,鄰域越大平滑的效果越好,但鄰域過大,平滑會使邊緣信息損失的越大,從而使輸出的圖像變得模糊,因此需合理選擇鄰域的大小。

 

0、線性濾波器和非線性濾波器

         線性濾波器的原始數據與濾波結果是一種算術運算,即用加減乘除等運算實現,如均值濾波器(模板內像素灰度值的平均值)、高斯濾波器(高斯加權平均值)等。由於線性濾波器是算術運算,有固定的模板,因此濾波器的轉移函數是可以確定並且是唯一的(轉移函數即模板的傅里葉變換)。
         非線性濾波器的原始數據與濾波結果是一種邏輯關係,即用邏輯運算實現,如最大值濾波器、最小值濾波器、中值濾波器等,是通過比較一定鄰域內的灰度值大小來實現的,沒有固定的模板,因而也就沒有特定的轉移函數(因爲沒有模板作傅里葉變換),另外,膨脹和腐蝕也是通過最大值、最小值濾波器實現的。

 

高斯噪聲和椒鹽噪聲區別

          高斯噪聲是指噪聲服從高斯分佈,即某個強度的噪聲點個數最多,離這個強度越遠噪聲點個數越少,且這個規律服從高斯分佈。高斯噪聲是一種加性噪聲,即噪聲直接加到原圖像上,因此可以用線性濾波器濾除
          椒鹽噪聲類似把椒鹽撒在圖像上,因此得名,是一種在圖像上出現很多白點或黑點的噪聲,如電視裏的雪花噪聲等。椒鹽噪聲可以認爲是一種邏輯噪聲,用線性濾波器濾除的結果不好,一般採用中值濾波器濾波可以得到較好的結果。

 

1、均值濾波—像素值取平均值

            圖片中一個方塊區域(一般爲3*3)內,中心點的像素爲全部點像素值的平均值。均值濾波就是對於整張圖片進行以上操作。我們可以看下圖的矩陣進行理解:
(1)、均值濾波的缺陷—去噪同時也破壞了圖像的細節:本身存在着固有的缺陷,即它不能很好地保護圖像細節,在圖像去噪的同時也破壞了圖像的細節部分,從而使圖像變得模糊,不能很好地去除噪聲點。特別是椒鹽噪聲。

可以看到圖片變模糊而且噪聲並沒有很有效的去除,該算法只是模糊化了圖片而已。

 

 

 

 

 

 

2、中值濾波—像素值遞增排序取中間:常用來去椒鹽噪聲、斑點噪聲

        中值濾波是一種非線性濾波,它能在濾除噪聲的同時很好的保持圖像邊緣。
中值濾波的原理:把以當前像素爲中心的小窗口內的所有像素的灰度按從小到大排序,取排序結果的中間值作爲該像素的灰度值。

       在一連串數字{1,4,6,8,9}中,數字6就是這串數字的中值。由此我們可以應用到圖像處理中。依然我們在圖像中去3*3的矩陣,裏面有9個像素點,我們將9個像素進行排序,最後將這個矩陣的中心點賦值爲這九個像素的中值。

可以看到,椒鹽噪聲很好的被平滑了,而且也沒均值那樣模糊化太過於嚴重。

 

1、給圖片添加椒鹽噪聲

        椒鹽噪聲(salt-and-pepper noise)是由圖像傳感器,傳輸信道,解碼處理等產生的黑白相間的亮暗點噪聲。所謂椒鹽,椒就是黑,鹽就是白,椒鹽噪聲就是在圖像上,隨機出現黑色白色的像素。椒鹽噪聲是一種因爲信號脈衝強度引起的噪聲,產生該噪聲的算法也比較簡單。往往由圖像切割引起,去除脈衝干擾及椒鹽噪聲最常用的算法是中值濾波

(1)、addSaltNoise函數,給一副數字圖像加上椒鹽噪聲的步驟,如下:

  • 指定信噪比 SNR(其取值範圍在[0, 1]之間)
  • 計算總像素數目 SP, 得到要加噪的像素數目 NP = SP * (1-SNR)
  • 隨機獲取要加噪的每個像素位置P(i, j)
  • 指定像素值爲255或者0。
  • 重複3,4兩個步驟完成所有像素的NP個像素
  • 輸出加噪以後的圖像

原圖→NSR信噪比0.9→NSR信噪比0.7

2、給椒鹽噪聲圖片進行中值濾波

           圖像結果可知,僅僅通過中值濾波還不夠。因此調整中值濾波器,也就是cv2.medianBlur(img, 3)函數,將ksize的3改爲5、7、101,會依次變清晰,但同時也會使圖像變模糊,因ksize太大了,把有用的信息也用中值代替了,誤差就逐漸顯現出來了,因此對ksize的選擇直接影響圖片的質量。

 

3、高斯濾波—對整幅圖像像素值進行加權平均

         高斯濾波是一種線性平滑濾波,適用於消除高斯噪聲,廣泛應用於圖像處理的減噪過程。通俗的講,高斯濾波就是對整幅圖像進行加權平均的過程,每一個像素點的值,都由其本身和鄰域內的其他像素值經過加權平均後得到。高斯濾波的具體操作是:用一個模板(或稱卷積、掩模)掃描圖像中的每一個像素,用模板確定的鄰域內像素的加權平均灰度值去替代模板中心像素點的值。

 

 

4、雙邊濾波—折中圖像的空間鄰近度和像素值相似度

        雙邊濾波不僅考慮了像素信息,也考慮到了像素位置信息。是一種非線性的濾波方法,是結合圖像的空間鄰近度和像素值相似度的一種折中處理,同時考慮空域信息和灰度相似性,達到保邊去噪的目的。

       Wij爲當前像素權值,Pij爲當前像素信息,Pi爲當前像素鄰域均值;Cij爲當前像素位置信息,Ci爲當前像素平均位置信息,\sigma1與\sigma2分別爲當前像素信息、當前像素位置的標準差。

 

 

 

 

 

參考文章
Opencv計算機視覺之路(三)——圖像處理(一)傅里葉變換

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章