Programming Computer Vision with Python (學習筆記五)

SciPy庫

SciPy庫,與以前咱們使用的NumPy和Matplotlib,都是scipy.org提供的用於科學計算方面的核心庫。相對NumPy,SciPy庫提供了面向更高層應用的算法和函數(其實也是基於NumPy實現的),並以子模塊的形式組織,每一個子模塊對應不一樣的應用領域,下面列出咱們關心的一部分進行說明:
constants:物理和數學常量
fftpack:快速傅里葉(立)變換
integrate: 積分和方程
interpolate: 插值
linalg: 線性代數
ndimage: N維圖像處理
optimize: 優化及根求解html

安裝python

sudo apt-get install python-scipy

圖像模糊數學原理

以灰度圖像爲例,把圖像的每一個像素的灰度值,變換爲它周圍鄰近的N個像素值的平均值,得出的圖像就有了模糊效果,但這種效果不理想,體現不出邊緣(不夠天然吧),因此提出了一種比較理想的方法,就是使用加權平均值,由於對某個像素而言,離它越近的像素,與它的關聯性越高,因此權值應該越大,相反,離它越遠的像素,與它的關聯性越低,權值應該越小。算法

那分配權值應該使用什麼樣的算法呢?最經常使用的就是高斯分佈函數shell

高斯分佈函數其實應該是高斯分佈的機率密度函數,簡稱高斯分佈函數正態分佈函數,它的二維空間的形態像一個,如圖:
512px-Gaussian_2d.svg.pngsvg

這裏咱們只關心二維的高斯分佈函數,由於等下咱們要把它應用在二維圖像的像素的權值分配上。下面是二維空間的高斯分佈函數公式:
圖片描述函數

這個公式被稱做高斯核。若是咱們給定sigma(如0.84089642)的值,以及高斯分佈的(範圍)大小,就能夠得出一個矩陣如:
圖片描述
注意中心元素 (4,4)處有最大值,隨着距離中心越遠,數值一圈圈地對稱減少。這樣,矩陣的每一個元素相對中心點的權值就已經知道了,若是咱們把這個矩陣的中心對應到圖像的每一個點,就能夠知道中心點對應的像素應該如何經過周圍的點來計算。優化

若是矩陣的中心對應到原圖像邊沿的像素點,那麼可能有一部分矩陣的元素落到圖像以外,爲保證能正常運算,一種簡單的處理就是把圖像一邊的數據複製到缺乏的一邊去。ui

對原圖像的每一個像素點,運用上面的權值矩陣,算出加權平均值,做爲新圖像的像素值,這個運算能夠用原圖像與矩陣的卷積來表示,而參與卷積的這個矩陣,叫模板,這種卷積運算,叫模板卷積。模板也稱爲算子。上面示例的這個矩陣,其實就是高斯平均算子。spa

高斯模糊

使用高斯平均算子來實現的圖像模糊叫高斯模糊(Gaussian blurring,也叫高斯平滑)
被認爲是一種最優的圖像平滑處理。除了模糊,還能夠用來磨皮(美顏)、製做景深、實現夢幻效果等。下面咱們使用Python來對一幅圖像進行模糊處理。code

咱們沒必要本身實現高斯模糊的計算過程,由於前面介紹的scipy的ndimage子模塊中就包含了高斯濾波器,它是一個函數:

scipy.ndimage.filters.gaussian_filter(input, sigma, order=0, ...
多維高斯濾波器
input: ndarray
sigma: 高斯核標準誤差,越大越模糊
order: 默認0,使用高斯核進行計算,還能夠指定不一樣值使用高斯一階、二階導數,之後再說

如下代碼示例以sigma爲2,5,10分別對一張圖像進行模糊,咱們使用的是GRB圖像,有3個通道,必須對每一個通道都應用濾波器:

from PIL import Image
import numpy as np
from scipy.ndimage import filters
import matplotlib.pyplot as plt

im = np.array(Image.open('Penguins.jpg'))

index = 141  #畫1行四列的圖,與 1,4,1 同
plt.subplot(index)
plt.imshow(im)

for sigma in (2, 5, 10):
    im_blur = np.zeros(im.shape, dtype=np.uint8)
    for i in range(3):  #對圖像的每個通道都應用高斯濾波
        im_blur[:,:,i] = filters.gaussian_filter(im[:,:,i], sigma)

    index += 1
    plt.subplot(index)
    plt.imshow(im_blur)

plt.show()

不一樣的sigma模糊程度對比:
圖片描述

小結

下一個筆記將記錄有關圖像邊緣檢測的實現,還會繼續運用模板卷積運算,將涉及到圖像導數,以及用於邊緣檢測的經常使用算子的介紹。

參考資料
維基百科:高斯模糊
高斯模糊淺析
高斯模糊的算法[計算機視覺特徵提取與圖像處理(第三版)]

相關文章
相關標籤/搜索