1.圖像模糊
圖像的高斯模糊是非常經典的圖像卷積例子。本質上,圖像模糊就是將(灰度)圖像I 和一個高斯核進行卷積操作:
,其中
是標准差為σ的二維高斯核。高斯模糊通常是其他圖像處理操作的一部分,比如圖像插值操作、興趣點計算以及很多其他應用。SciPy 有用來做濾波操作的scipy.ndimage.filters 模塊。該模塊使用快速一維分離的方式來計算卷積。eg:
from PIL import Image from numpy import *
from scipy.ndimage import filters im = array(Image.open('empire.jpg').convert('L')) im2 = filters.gaussian_filter(im,5) %第二個參數表示標准差
隨着σ 的增加,一幅圖像被模糊的程度。σ 越大,處理后的圖像細節丟失越多。如果打算模糊一幅彩色圖像,只需簡單地對每一個顏色通道進行高斯模糊:
im = array(Image.open('empire.jpg')) im2 = zeros(im.shape) for i in range(3): im2[:,:,i] = filters.gaussian_filter(im[:,:,i],5) im2 = uint8(im2)

原始圖像 使用σ=5的高斯濾波器
2.圖像導數
在很多應用中圖像強度的變化情況是非常重要的信息。強度的變化可以用灰度圖像I(對於彩色圖像,通常對每個顏色通道分別計算導數)的x和y 方向導數Ix 和Iy 進行描述。圖像的梯度向量為
。梯度有兩個重要的屬性,一是梯度的大小:
,它描述了圖像強度變化的強弱,一是梯度的角度:
,描述了圖像中在每個點(像素)上強度變化最大的方向。NumPy 中的arctan2() 函數返回弧度表示的有符號角度,角度的變化區間為-π...π。可以用離散近似的方式來計算圖像的導數。圖像導數大多數可以通過卷積簡單地實現:
。
對於Dx 和Dy,通常選擇Prewitt 濾波器:

或者Sobel 濾波器:

這些導數濾波器可以使用scipy.ndimage.filters 模塊的標准卷積操作來簡單地實現:
from PIL import Image from numpy import *
from scipy.ndimage import filters im = array(Image.open('empire.jpg').convert('L')) #轉化為灰度圖像 # Sobel 導數濾波器 imx = zeros(im.shape) filters.sobel(im,1,imx) imy = zeros(im.shape) filters.sobel(im,0,imy) magnitude = sqrt(imx**2+imy**2)
上面的腳本使用Sobel 濾波器來計算x 和y 的方向導數,以及梯度大小。sobel() 函數的第二個參數表示選擇x 或者y 方向導數,第三個參數保存輸出的變量。在兩個導數圖像中,正導數顯示為亮的像素,負導數顯示為暗的像素。灰色區域表示導數的值接近於零。
上述計算圖像導數的方法有一些缺陷:在該方法中,濾波器的尺度需要隨着圖像分辨率的變化而變化。為了在圖像噪聲方面更穩健,以及在任意尺度上計算導數,可以使用高斯導數濾波器:
。
之前用於模糊的filters.gaussian_filter() 函數可以接受額外的參數,用來計算高斯導數。可以簡單地按照下面的方式來處理:
sigma = 5 # 標准差 imx = zeros(im.shape) filters.gaussian_filter(im, (sigma,sigma), (0,1), imx) imy = zeros(im.shape) filters.gaussian_filter(im, (sigma,sigma), (1,0), imy)
該函數的第三個參數指定對每個方向計算哪種類型的導數,第二個參數為使用的標准差。
