Python OpenCV圖像處理之圖像濾波特效詳解
1 分類
圖像濾波按圖像域可分為兩種類型:
- 鄰域濾波(Spatial Domain Filter),其本質是數(shù)字窗口上的數(shù)學運算。一般用于圖像平滑、圖像銳化、特征提取(如紋理測量、邊緣檢測)等,鄰域濾波使用鄰域算子——利用給定像素周圍像素值以決定此像素最終輸出的一種算子
- 頻域濾波(Frequency Domain Filter),其本質是對像素頻率的修改。一般用于降噪、重采樣、圖像壓縮等。
按圖像頻率濾除效果主要分為兩種類型:
- 低通濾波。濾除原圖像的高頻成分,即模糊圖像邊緣與細節(jié)。
- 高通濾波。濾除原圖像的低頻成分,即圖像銳化。
導入原圖和噪圖
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:高斯加性噪聲,每點具有特定局部方差
- poisson: 泊松分布噪聲
- salt:鹽噪聲,隨機用1替換像素
- pepper:胡椒噪聲,隨機用0或-1替換像素
- s&p:椒鹽噪聲,呈現(xiàn)出黑白雜點
2 鄰域濾波
2.1 線性濾波
線性鄰域濾波,指像素的輸出值取決于輸入?yún)^(qū)域像素的加權和,下面介紹常見的線性濾波算子。
2.1.1 方框濾波
方框濾波(Box Filter),其核函數(shù)為:
非歸一化的方框濾波用于計算每個像素鄰域內的積分特性,比如密集光流算法(Dense Optical Flow Algorithms)中用到的圖像倒數(shù)的協(xié)方差矩陣。
歸一化的方框濾波則為均值濾波(Blur),即鄰域平均法——用一片圖像區(qū)域各個像素的均值來代替原圖像中的各個像素值。均值濾波用于圖像平滑,但其在降噪的同時也破壞了圖像的邊緣細節(jié),從而使圖像變得模糊,降噪能力較差。
進行方框濾波
# 方框濾波 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)
若將方框濾波核設為(6,5)且歸一化,則效果與均值濾波相同。
2.1.2 高斯濾波
高斯濾波(Gauss Filter)基于二維高斯核函數(shù)
具有在保持細節(jié)的條件下進行噪聲濾波的能力,因此廣泛應用于圖像降噪中,但其效率比均值濾波低。
高斯濾波器有兩個特征量:
- 核大小,其決定了圖像的平滑范圍。理論上,高斯核函數(shù)應該無窮大,以達到最佳的平滑效果,但過大的卷積核會導致運算效率驟降。根據(jù)高斯函數(shù)3σ規(guī)則,可以取高斯核大小為(6σ+1)×(6σ+1);
- 離散程度σ,其決定了對高頻成分的抑制程度。σ越大,像素加權半徑越大,平滑程度越強。
# 高斯濾波 gaussImg = cv2.GaussianBlur(noiseImg, (5, 5), 0) cv2.namedWindow("gaussain image") cv2.imshow("gaussain image", gaussImg)
2.2 非線性濾波
雖然線性濾波器易于構造且計算效率高,但有些情況下,使用鄰域像素的非線性濾波效果更好。例如,若圖像具有椒鹽噪聲而非高斯噪聲,此時對圖像高斯濾波并不會去除噪聲像素,只是把噪聲轉換為更為柔和但仍然可見的顆粒。
中值濾波(Median filter)是一種基于排序統(tǒng)計理論的典型非線性濾波技術,核心原理是用像素點鄰域灰度值中值代替該像素點的灰度值。中值濾波對脈沖噪聲、椒鹽噪聲尤為有效,且具有邊緣保護特性。中值濾波器本質上是數(shù)字窗口內的非線性取中值運算,而非線性濾波器的加權運算,因此中值濾波沒有卷積核,運算效率僅有線性濾波的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)
中值濾波對椒鹽噪聲效果
3 頻域濾波
通過傅里葉變換將圖像變換到頻域,即可在頻域進行圖像處理。根據(jù)傅里葉變換的對稱性以及從低頻到高頻的排列規(guī)則,圖像原始頻域圖像會在四角形成低頻分量區(qū),而形成高頻中心。通常為了觀察方便,變換算法(例如Matlab中的fftshift)會將低頻分量移動到圖像中心形成低頻中心
圖像傅里葉變換代碼如下
# 傅里葉變換 dft = cv2.dft(np.float32(grayImg), flags = cv2.DFT_COMPLEX_OUTPUT) # 將圖像中的低頻部分移動到圖像的中心 dftShift = np.fft.fftshift(dft) # 計算幅頻特性 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) # 求得圖像的中心點位置 # 低通 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) # 求得圖像的中心點位置 # 低通 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圖像處理之圖像濾波特效詳解的詳細內容,更多關于Python OpenCV圖像濾波特效的資料請關注腳本之家其它相關文章!
相關文章
Python常見錯誤:IndexError:?list?index?out?of?range解決
最近在寫一個爬蟲程序,但是卻出現(xiàn)了錯誤提示IndexError:?list?index?out?of?range,所以下面這篇文章主要給大家介紹了關于Python常見錯誤:IndexError:?list?index?out?of?range的解決方法,需要的朋友可以參考下2023-01-01python tkinter制作用戶登錄界面的簡單實現(xiàn)
這篇文章主要介紹了python tkinter制作用戶登錄界面的簡單實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04python數(shù)據(jù)結構之線性表的順序存儲結構
這篇文章主要為大家詳細介紹了python數(shù)據(jù)結構之線性表的順序存儲結構,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09Jupyter Notebook讀取csv文件出現(xiàn)的問題及解決
這篇文章主要介紹了Jupyter Notebook讀取csv文件出現(xiàn)的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01解決更改AUTH_USER_MODEL后出現(xiàn)的問題
這篇文章主要介紹了解決更改AUTH_USER_MODEL后出現(xiàn)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05