Python OpenCV圖像處理之圖像濾波特效詳解
1 分類
圖像濾波按圖像域可分為兩種類型:
- 鄰域?yàn)V波(Spatial Domain Filter),其本質(zhì)是數(shù)字窗口上的數(shù)學(xué)運(yùn)算。一般用于圖像平滑、圖像銳化、特征提取(如紋理測(cè)量、邊緣檢測(cè))等,鄰域?yàn)V波使用鄰域算子——利用給定像素周圍像素值以決定此像素最終輸出的一種算子
- 頻域?yàn)V波(Frequency Domain Filter),其本質(zhì)是對(duì)像素頻率的修改。一般用于降噪、重采樣、圖像壓縮等。
按圖像頻率濾除效果主要分為兩種類型:
- 低通濾波。濾除原圖像的高頻成分,即模糊圖像邊緣與細(xì)節(jié)。
- 高通濾波。濾除原圖像的低頻成分,即圖像銳化。
導(dǎo)入原圖和噪圖
import cv2,skimage
import numpy as np
?
# 原圖
srcImg = cv2.imread("test.jpg")
cv2.imshow("src image", srcImg)
# 給圖像增加高斯噪聲
noiseImg = skimage.util.random_noise(srcImg, mode='gaussian')
cv2.imshow("image with noise", noiseImg)

其中噪聲可選
- gaussian:高斯加性噪聲
- localvar:高斯加性噪聲,每點(diǎn)具有特定局部方差
- poisson: 泊松分布噪聲
- salt:鹽噪聲,隨機(jī)用1替換像素
- pepper:胡椒噪聲,隨機(jī)用0或-1替換像素
- s&p:椒鹽噪聲,呈現(xiàn)出黑白雜點(diǎn)
2 鄰域?yàn)V波
2.1 線性濾波
線性鄰域?yàn)V波,指像素的輸出值取決于輸入?yún)^(qū)域像素的加權(quán)和,下面介紹常見的線性濾波算子。
2.1.1 方框?yàn)V波
方框?yàn)V波(Box Filter),其核函數(shù)為:

非歸一化的方框?yàn)V波用于計(jì)算每個(gè)像素鄰域內(nèi)的積分特性,比如密集光流算法(Dense Optical Flow Algorithms)中用到的圖像倒數(shù)的協(xié)方差矩陣。
歸一化的方框?yàn)V波則為均值濾波(Blur),即鄰域平均法——用一片圖像區(qū)域各個(gè)像素的均值來代替原圖像中的各個(gè)像素值。均值濾波用于圖像平滑,但其在降噪的同時(shí)也破壞了圖像的邊緣細(xì)節(jié),從而使圖像變得模糊,降噪能力較差。
進(jìn)行方框?yàn)V波
# 方框?yàn)V波
boxImg = cv2.boxFilter(noiseImg, ddepth = -1, ksize = (2, 2), normalize = False)
cv2.imshow("box Image", boxImg)
# 均值濾波
blurImg = cv2.blur(noiseImg, (6, 5))
cv2.imshow("blur image", blurImg)


若將方框?yàn)V波核設(shè)為(6,5)且歸一化,則效果與均值濾波相同。
2.1.2 高斯濾波
高斯濾波(Gauss Filter)基于二維高斯核函數(shù)

具有在保持細(xì)節(jié)的條件下進(jìn)行噪聲濾波的能力,因此廣泛應(yīng)用于圖像降噪中,但其效率比均值濾波低。
高斯濾波器有兩個(gè)特征量:
- 核大小,其決定了圖像的平滑范圍。理論上,高斯核函數(shù)應(yīng)該無窮大,以達(dá)到最佳的平滑效果,但過大的卷積核會(huì)導(dǎo)致運(yùn)算效率驟降。根據(jù)高斯函數(shù)3σ規(guī)則,可以取高斯核大小為(6σ+1)×(6σ+1);
- 離散程度σ,其決定了對(duì)高頻成分的抑制程度。σ越大,像素加權(quán)半徑越大,平滑程度越強(qiáng)。

# 高斯濾波
gaussImg = cv2.GaussianBlur(noiseImg, (5, 5), 0)
cv2.namedWindow("gaussain image")
cv2.imshow("gaussain image", gaussImg)

2.2 非線性濾波
雖然線性濾波器易于構(gòu)造且計(jì)算效率高,但有些情況下,使用鄰域像素的非線性濾波效果更好。例如,若圖像具有椒鹽噪聲而非高斯噪聲,此時(shí)對(duì)圖像高斯濾波并不會(huì)去除噪聲像素,只是把噪聲轉(zhuǎn)換為更為柔和但仍然可見的顆粒。

中值濾波(Median filter)是一種基于排序統(tǒng)計(jì)理論的典型非線性濾波技術(shù),核心原理是用像素點(diǎn)鄰域灰度值中值代替該像素點(diǎn)的灰度值。中值濾波對(duì)脈沖噪聲、椒鹽噪聲尤為有效,且具有邊緣保護(hù)特性。中值濾波器本質(zhì)上是數(shù)字窗口內(nèi)的非線性取中值運(yùn)算,而非線性濾波器的加權(quán)運(yùn)算,因此中值濾波沒有卷積核,運(yùn)算效率僅有線性濾波的1/5左右。
# 原圖
srcImg = cv2.imread("test.jpg")
cv2.imshow("src image", srcImg)
# 給圖像增加椒鹽噪聲
noiseImg = skimage.util.random_noise(srcImg, mode='s&p')
cv2.imshow("image with noise", noiseImg)
medImg = cv2.medianBlur(np.uint8(noiseImg * 255), 3)
cv2.namedWindow("median image")
cv2.imshow("median image", medImg)


中值濾波對(duì)椒鹽噪聲效果
3 頻域?yàn)V波
通過傅里葉變換將圖像變換到頻域,即可在頻域進(jìn)行圖像處理。根據(jù)傅里葉變換的對(duì)稱性以及從低頻到高頻的排列規(guī)則,圖像原始頻域圖像會(huì)在四角形成低頻分量區(qū),而形成高頻中心。通常為了觀察方便,變換算法(例如Matlab中的fftshift)會(huì)將低頻分量移動(dòng)到圖像中心形成低頻中心

圖像傅里葉變換代碼如下
# 傅里葉變換
dft = cv2.dft(np.float32(grayImg), flags = cv2.DFT_COMPLEX_OUTPUT)
# 將圖像中的低頻部分移動(dòng)到圖像的中心
dftShift = np.fft.fftshift(dft)
# 計(jì)算幅頻特性
magnitude = 20 * np.log(cv2.magnitude(dftShift[:, :, 0], dftShift[:, :, 1]))
plt.subplot(121), plt.imshow(grayImg, cmap = 'gray')
plt.title('原圖'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(magnitude, cmap = 'gray')
plt.title('頻譜圖'), plt.xticks([]), plt.yticks([])
plt.show()
3.1 低通濾波
# 定義濾波掩碼
def mask(img, ftype):
crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) # 求得圖像的中心點(diǎn)位置
# 低通
if ftype == 'low':
mask = np.zeros((img.shape[0], img.shape[1], 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1
# 高通
if ftype == 'high':
mask = np.ones((img.shape[0], img.shape[1], 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 0
return mask
lowImg = dftShift * mask(grayImg, 'low')
lowImg = np.fft.ifftshift(lowImg)
lowImg = cv2.idft(lowImg)
lowImg = cv2.magnitude(lowImg[:, :, 0], lowImg[:, :, 1])

3.2 高通濾波
# 定義濾波掩碼
def mask(img, ftype):
crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) # 求得圖像的中心點(diǎn)位置
# 低通
if ftype == 'low':
mask = np.zeros((img.shape[0], img.shape[1], 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1
# 高通
if ftype == 'high':
mask = np.ones((img.shape[0], img.shape[1], 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 0
return mask
highImg = dftShift * mask(grayImg, 'high')
highImg = np.fft.ifftshift(highImg)
highImg = cv2.idft(highImg)
highImg = cv2.magnitude(highImg[:, :, 0], highImg[:, :, 1])

以上就是Python OpenCV圖像處理之圖像濾波特效詳解的詳細(xì)內(nèi)容,更多關(guān)于Python OpenCV圖像濾波特效的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
利用selenium 3.7和python3添加cookie模擬登陸的實(shí)現(xiàn)
這篇文章主要給大家介紹了關(guān)于利用selenium 3.7和python3添加cookie模擬登陸的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
解決numpy矩陣相減出現(xiàn)的負(fù)值自動(dòng)轉(zhuǎn)正值的問題
這篇文章主要介紹了解決numpy矩陣相減出現(xiàn)的負(fù)值自動(dòng)轉(zhuǎn)正值的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06
Python3視頻轉(zhuǎn)字符動(dòng)畫的實(shí)例代碼
這篇文章主要介紹了Python3視頻轉(zhuǎn)字符動(dòng)畫的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
修復(fù)python-memcached在python3.8環(huán)境中報(bào)SyntaxWarning的問題(完美解決)
我們一直使用python-memcached庫來操作memcached,最近發(fā)現(xiàn)在python3.8的環(huán)境中,代碼會(huì)報(bào)錯(cuò),下面通過本文給大家講解修復(fù)python-memcached在python3.8環(huán)境中報(bào)SyntaxWarning的問題及解決方法,需要的朋友可以參考下2022-08-08
Python網(wǎng)絡(luò)爬蟲項(xiàng)目:內(nèi)容提取器的定義
本篇文章主要介紹了Python網(wǎng)絡(luò)爬蟲項(xiàng)目,這能有效的節(jié)省程序員的時(shí)間,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-10-10
Python實(shí)現(xiàn)的一個(gè)自動(dòng)售飲料程序代碼分享
這篇文章主要介紹了Python實(shí)現(xiàn)的一個(gè)自動(dòng)售飲料程序代碼分享,就是用python實(shí)現(xiàn)的生活中一種投幣式自動(dòng)售飲料機(jī)的內(nèi)部程序判斷代碼,需要的朋友可以參考下2014-08-08
解決新django中的path不能使用正則表達(dá)式的問題
今天小編就為大家分享一篇解決新django中的path不能使用正則表達(dá)式的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12

