溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python和OpenCV如何實(shí)現(xiàn)高斯濾波

發(fā)布時(shí)間:2021-09-24 15:29:27 來源:億速云 閱讀:228 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下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ù)公式:

Python和OpenCV如何實(shí)現(xiàn)高斯濾波

 計(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)高斯濾波

Python和OpenCV如何實(shí)現(xiàn)高斯濾波Python和OpenCV如何實(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]
    # 直接拷貝父對象
    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ù)采取的是針對3*3的kernel_size進(jìn)行編寫的,要更改kernel_size的大小,需要更改此處的range范圍。 

Python和OpenCV如何實(shí)現(xiàn)高斯濾波

 下面是灰度圖像的處理方式:

def myfilter2(img,kernel):
    # 讀取img行數(shù)核列數(shù)
    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

 最后整個(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é)果展示:

原圖與高斯濾波后

Python和OpenCV如何實(shí)現(xiàn)高斯濾波Python和OpenCV如何實(shí)現(xiàn)高斯濾波

需要注意的是采取的方法很原始,如果輸入的圖像過大,運(yùn)行時(shí)間會(huì)很久。

以上是“Python和OpenCV如何實(shí)現(xiàn)高斯濾波”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI