Python+OpenCV 實(shí)現(xiàn)簡單的高斯濾波(推薦)
基本原理講解:高斯模糊的算法
高斯核函數(shù)的編寫:構(gòu)建權(quán)重矩陣,采用高斯二維分布函數(shù)的形式進(jìn)行處理。需要注意的是,這里我沒有特判當(dāng)sigma = 0的時(shí)候的情況。
即是實(shí)現(xiàn):
1)權(quán)重矩陣的構(gòu)建
根據(jù)公式:

計(jì)算矩陣內(nèi)部結(jié)構(gòu),其中因?yàn)橐M(jìn)行歸一化處理,e前方的系數(shù)會(huì)被約去,因此代碼中不體現(xiàn)。
2)矩陣元素歸一化處理
計(jì)算矩陣內(nèi)部元素總和sum,最后做矩陣除法得到歸一化處理后的權(quán)重矩陣。
# 高斯核生成函數(shù) kernel_size:濾波核大小 sigma:高斯核函數(shù)的局部影響范圍
def gauss(kernel_size, sigma):
#定型0填充
kernel = np.zeros((kernel_size, kernel_size))
#確定正態(tài)分布中間值
center = kernel_size // 2
# s:方差 sum:記錄總和
s = sigma ** 2
sum = 0
for i in range(kernel_size):
for j in range(kernel_size):
#由于最后要進(jìn)行歸一化處理,此處根號(hào)下2Π計(jì)算可以省略
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
濾波函數(shù)的編寫:將圖片中的每個(gè)像素點(diǎn)(邊緣除外)及其周圍像素乘以權(quán)重矩陣,實(shí)現(xiàn)高斯濾波


需要注意的是此函數(shù)僅能處理彩色圖片,因?yàn)橹挥胁噬珗D片擁有img.shape[2]元素,灰度圖片沒有img.shape[2]元素不能用這個(gè)方法處理。
# 高斯濾波實(shí)現(xiàn),img:輸入圖像 kermel:輸入高斯核函數(shù)
def myfilter(img,kernel):
# 讀取img行數(shù)核列數(shù)
h = img.shape[0]
w = img.shape[1]
# 直接拷貝父對(duì)象
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
# 加權(quán)
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
同時(shí)在處理高斯濾波的時(shí)候,函數(shù)采取的是針對(duì)3*3的kernel_size進(jìn)行編寫的,要更改kernel_size的大小,需要更改此處的range范圍。

下面是灰度圖像的處理方式:
def myfilter2(img,kernel):
# 讀取img行數(shù)核列數(shù)
h = img.shape[0]
w = img.shape[1]
# 直接拷貝父對(duì)象
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
最后整個(gè)運(yùn)行代碼:
import copy
import cv2
import numpy as np
#圖像讀取
img_y = cv2.imread('p2.jpg')
# 選擇高斯生成函數(shù)3*3,其中sigama = 3
kernel = gauss(3,3)
# 打印這個(gè)生成函數(shù)
print(kernel)
# 高斯濾波處理
img1 = myfilter(img_y, kernel)
cv2.imshow('P1_yuantu',img_y)
cv2.imshow('P1_gaussian', img1)
cv2.waitKey(0)
輸入輸出圖像結(jié)果展示:
原圖與高斯濾波后


需要注意的是采取的方法很原始,如果輸入的圖像過大,運(yùn)行時(shí)間會(huì)很久。
這方面東西挺有意思的,只是初略的學(xué)習(xí),寫些基礎(chǔ)的東西,應(yīng)該還有錯(cuò)漏的地方,希望有大佬們多多指點(diǎn)。
到此這篇關(guān)于Python+OpenCV 實(shí)現(xiàn)簡單的高斯濾波的文章就介紹到這了,更多相關(guān)Python OpenCV 高斯濾波內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PyTorch中clone()、detach()及相關(guān)擴(kuò)展詳解
這篇文章主要給大家介紹了關(guān)于PyTorch中clone()、detach()及相關(guān)擴(kuò)展的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Python基于pillow庫實(shí)現(xiàn)生成圖片水印
這篇文章主要介紹了Python基于pillow庫實(shí)現(xiàn)生成圖片水印,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
python3實(shí)現(xiàn)繪制二維點(diǎn)圖
今天小編就為大家分享一篇python3實(shí)現(xiàn)繪制二維點(diǎn)圖,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12
Python標(biāo)準(zhǔn)庫之collections包的使用教程
這篇文章主要給大家介紹了Python標(biāo)準(zhǔn)庫之collections包的使用教程,詳細(xì)介紹了collections中多個(gè)集合類的使用方法,相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面隨小編一起來學(xué)習(xí)學(xué)習(xí)吧。2017-04-04
pandas參數(shù)設(shè)置的實(shí)用小技巧
這篇文章主要給大家介紹了關(guān)于pandas參數(shù)設(shè)置的實(shí)用小技巧,文中通過實(shí)例代碼結(jié)束的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用pandas具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

