1 - 引言
空間濾波是圖像處理領域應用廣泛的主要工具之一。這裏我們主要討論怎樣使用空間濾波來增強圖像。
2 - 平滑空間濾波器
平滑濾波器用於模糊處理和降低噪聲。模糊處理經常用於預處理任務中,例如在目標提取之前去除圖像中的一些瑣碎細節。
2.1 - 平滑線性濾波器
平滑線性空間濾波器的輸出(響應)是包含在濾波器過濾核中像素的簡單平均值,也成爲均值濾波。
這種處理的結果降低了圖像灰度的“尖銳”變化。
這種濾波器(3x3)一般分爲兩種
- 第一種爲標準像素平均值
- 第二種爲加權平均
import cv2
import numpy as np
img = cv2.imread('images/cat.jpg')
cv2.imshow('images',img)
"""
blur—圖像均值平滑濾波
函數原型:blur(src, ksize, dst=None, anchor=None, borderType=None)
src:圖像矩陣
ksize:濾波窗口尺寸
"""
res = cv2.blur(img, (3, 3))
cv2.imshow('res', res)
"""
GaussianBlur—圖像高斯平滑濾波
函數原型:GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)
src:圖像矩陣
ksize:濾波窗口尺寸
sigmaX:標準差
"""
res2 = cv2.GaussianBlur(img,(3,3),0)
cv2.imshow('res2', res2)
cv2.waitKey()
(可以用來磨皮哦,手動滑稽)
2.2 - 非線性濾波器
這種濾波器的響應一濾波器過濾核中像素的排序爲基礎,然後使用統計排序的結果決定代替中心像素的值。這一類最知名的濾波器是中值濾波器,正如其名,它是將像素領域內灰度的終止代替該像素的值。中值濾波器對處理脈衝噪聲非常有效,這種噪聲也成爲椒鹽噪聲。
import cv2
import numpy as np
img = cv2.imread('images/lena_1.jpg')
cv2.imshow('img', img)
"""
medianBlur—圖像中值濾波
函數原型:medianBlur(src, ksize, dst=None)
src:圖像矩陣
ksize:濾波窗口尺寸
"""
res = cv2.medianBlur(img, 5)
cv2.imshow('res', res)
cv2.waitKey()
3 - 銳化空間濾波器
銳化處理的主要目的是突出灰度的過度部分。
3.1 - 使用二階微分進行圖像銳化——拉普拉斯算子
一個二維圖像函數f(x,y)的拉普拉斯算子定義爲
離散形式爲
我們可以發現這正好可以寫成濾波器:
由於拉普拉斯是一種微分算子,因此其應用強調的是圖像中灰度的突變,並不強調灰度級緩慢變化的區域。將原圖像和拉普拉斯圖像疊加在一起的簡單方法,可以復原背景特性並保持拉普拉斯銳化處理的效果。
如果所使用的定義具有負的中心繫數,那麼必須將原圖像減去拉普拉斯變換後的圖像而不是加上它,從而得到銳化的結果。
import cv2
import numpy as np
img = cv2.imread('images/lena.jpg')
cv2.imshow('img',img)
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)
#kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
dst = cv2.filter2D(img, -1, kernel=kernel)
cv2.imshow('res',dst)
cv2.waitKey(0)
3.2 - 非銳化巖壁和高提升濾波
在印刷和出版界已用了多年的圖像銳化處理過程是從原圖像中減去一副非銳化(平滑過)版本。
非銳化掩蔽的處理過程爲:
- 模糊原圖像
- 從原圖像中減去模糊圖像(產生的差值圖像成爲模板)
- 將模板加到原圖像上
(這個較爲簡單就不進行試驗了)
3.3 - 使用一階微分對(非線性)圖像銳化——梯度
使用梯度銳化圖像的算子叫Sobel算子
Sobel算子依然是一種過濾器
圖像的每一個像素的橫向及縱向梯度近似值可用以下的公式結合,來計算梯度的大小。
Sobel算子包含兩組3x3的矩陣,分別爲橫向及縱向模板,將之與圖像作平面卷積,即可分別得出橫向及縱向的亮度差分近似值。實際使用中,常用如下兩個模板來檢測圖像邊緣。
# coding=utf-8
import cv2
img = cv2.imread("images/lena.jpg")
cv2.imshow('img',img)
"""
Sobel函數
Sobel(src, ddepth, dx, dy, dst=None, ksize=None, scale=None, delta=None, borderType=None)
前四個是必須的參數:
第一個參數是需要處理的圖像;
第二個參數是圖像的深度,-1表示採用的是與原圖像相同的深度。目標圖像的深度必須大於等於原圖像的深度;
第三和第四:dx和dy表示的是求導的階數,0表示這個方向上沒有求導,一般爲0、1、2。
其後是可選的參數
"""
x = cv2.Sobel(img, -1, 0, 1)
cv2.imshow('res',x)
cv2.waitKey(0)