Python+OpenCV 實現簡單的高斯濾波(推薦)
基本原理講解:高斯模糊的算法
高斯核函數的編寫:構建權重矩陣,采用高斯二維分佈函數的形式進行處理。需要註意的是,這裡我沒有特判當sigma = 0的時候的情況。
即是實現:
1)權重矩陣的構建
根據公式:
計算矩陣內部結構,其中因為要進行歸一化處理,e前方的系數會被約去,因此代碼中不體現。
2)矩陣元素歸一化處理
計算矩陣內部元素總和sum,最後做矩陣除法得到歸一化處理後的權重矩陣。
# 高斯核生成函數 kernel_size:濾波核大小 sigma:高斯核函數的局部影響范圍 def gauss(kernel_size, sigma): #定型0填充 kernel = np.zeros((kernel_size, kernel_size)) #確定正態分佈中間值 center = kernel_size // 2 # s:方差 sum:記錄總和 s = sigma ** 2 sum = 0 for i in range(kernel_size): for j in range(kernel_size): #由於最後要進行歸一化處理,此處根號下2Π計算可以省略 x, y = i - center, j - center kernel[i, j] = np.exp(-(x ** 2 + y ** 2) / (2 * s)) sum += kernel[i, j] #歸一化處理後輸出 kernel = kernel / sum return kernel
濾波函數的編寫:將圖片中的每個像素點(邊緣除外)及其周圍像素乘以權重矩陣,實現高斯濾波
需要註意的是此函數僅能處理彩色圖片,因為隻有彩色圖片擁有img.shape[2]元素,灰度圖片沒有img.shape[2]元素不能用這個方法處理。
# 高斯濾波實現,img:輸入圖像 kermel:輸入高斯核函數 def myfilter(img,kernel): # 讀取img行數核列數 h = img.shape[0] w = img.shape[1] # 直接拷貝父對象 img1 = copy.copy(img) # 去掉邊緣 for i in range(1,h-1): for j in range(1,w-1): # 三通道處理 for c in range(0,2): sum = 0 # 加權 for k in range(-1,2): for l in range(-1,2): sum += img[i+k,j+l,c]*kernel[k+1,l+1] img1[i,j,c] = sum return img1
同時在處理高斯濾波的時候,函數采取的是針對3*3的kernel_size進行編寫的,要更改kernel_size的大小,需要更改此處的range范圍。
下面是灰度圖像的處理方式:
def myfilter2(img,kernel): # 讀取img行數核列數 h = img.shape[0] w = img.shape[1] # 直接拷貝父對象 img1 = copy.copy(img) # 去掉邊緣 for i in range(1,h-1): for j in range(1,w-1): sum = 0 for k in range(-1,2): for l in range(-1,2): sum += img[i+k,j+l]*kernel[k+1,l+1] img1[i,j] = sum return img1
最後整個運行代碼:
import copy import cv2 import numpy as np #圖像讀取 img_y = cv2.imread('p2.jpg') # 選擇高斯生成函數3*3,其中sigama = 3 kernel = gauss(3,3) # 打印這個生成函數 print(kernel) # 高斯濾波處理 img1 = myfilter(img_y, kernel) cv2.imshow('P1_yuantu',img_y) cv2.imshow('P1_gaussian', img1) cv2.waitKey(0)
輸入輸出圖像結果展示:
原圖與高斯濾波後
需要註意的是采取的方法很原始,如果輸入的圖像過大,運行時間會很久。
這方面東西挺有意思的,隻是初略的學習,寫些基礎的東西,應該還有錯漏的地方,希望有大佬們多多指點。
到此這篇關於Python+OpenCV 實現簡單的高斯濾波的文章就介紹到這瞭,更多相關Python OpenCV 高斯濾波內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- python實現高斯模糊及原理詳解
- OpenCV-Python實現油畫效果的實例
- Python+OpenCV實現表面缺陷檢測
- python OpenCV 實現高斯濾波詳解
- OpenCV+Python幾何變換的實現示例