日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

图像处理:高斯滤波算法

發(fā)布時(shí)間:2024/3/13 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像处理:高斯滤波算法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

前言

概念介紹

基本原理

卷積核的大小

卷積核的形狀和權(quán)重比

卷積核的歸一化

結(jié)論

Opencv實(shí)現(xiàn)高斯濾波

Python手寫實(shí)現(xiàn)高斯濾波

參考文章


前言

在此之前,我曾在此篇中推導(dǎo)過(guò)圖像處理:推導(dǎo)五種濾波算法(均值、中值、高斯、雙邊、引導(dǎo))。這在此基礎(chǔ)上,我想更深入地研究和推導(dǎo)這些算法,以便為將來(lái)處理圖像的項(xiàng)目打下基礎(chǔ)。

概念介紹

高斯濾波是一種常用的圖像處理技術(shù),常用于去噪、平滑和邊緣檢測(cè)等應(yīng)用中。它是基于高斯函數(shù)的概念,由于高斯函數(shù)的性質(zhì),距離中心像素越遠(yuǎn)的像素對(duì)新值的貢獻(xiàn)越小,對(duì)圖像中的像素進(jìn)行加權(quán)平均處理,使得周圍像素的影響比較大,而遠(yuǎn)離中心像素的影響則較小。因此,高斯濾波可以平滑圖像并去除一部分噪聲,同時(shí)保留圖像中的邊緣和細(xì)節(jié)。

具體來(lái)說(shuō),高斯濾波是通過(guò)一個(gè)矩陣(卷積核)來(lái)實(shí)現(xiàn)的。這個(gè)矩陣的值是由高斯函數(shù)計(jì)算出來(lái)的,高斯函數(shù)在中心點(diǎn)處取得最大值,隨著距離的增加而逐漸減小。矩陣的大小和參數(shù)的選擇取決于需要處理的圖像和要達(dá)到的效果。

基本原理

這里以一個(gè)3x3的卷積核為例,卷積核的值是由高斯函數(shù)計(jì)算出來(lái)的,高斯函數(shù)在中心點(diǎn)處取得最大值,隨著距離的增加而逐漸減小。通過(guò)對(duì)每個(gè)像素應(yīng)用卷積核,高斯濾波可以對(duì)圖像進(jìn)行平滑處理并去除噪聲,同時(shí)保留圖像的細(xì)節(jié)和邊緣。

如上圖所示,高斯函數(shù)在中心點(diǎn)處的值最大,離中心點(diǎn)越遠(yuǎn)的值越小。這意味著對(duì)于每個(gè)像素,距離中心像素越遠(yuǎn)的像素對(duì)新值的影響越小。這種影響方式使得高斯濾波可以去除圖像噪聲,同時(shí)保留圖像細(xì)節(jié)和邊緣。

通過(guò)高斯濾波的計(jì)算過(guò)程,可以得出中心點(diǎn)像素值226被新值164所替代的結(jié)果。具體來(lái)說(shuō),通過(guò)一個(gè)簡(jiǎn)單的矩陣點(diǎn)乘計(jì)算,將卷積核與圖像中的像素矩陣相乘,得出每個(gè)像素的新值。

它的計(jì)算過(guò)程如下所示:

a=40*1+107*2+5*1+198*2+226*8+223*2+37*1+68*2+193*1 b=a*(1/(1*4+2*4+8)) print(b)

卷積核的大小

前面舉的例子是以3x3大小的卷積核為例,這里就詳細(xì)補(bǔ)充一些有關(guān)于卷積核的知識(shí)。

卷積核的形狀和權(quán)重比

卷積核的形狀通常是一個(gè)矩陣,長(zhǎng)和寬可以有所不同,但必須是奇數(shù)。在高斯濾波中,卷積核的大小通常是3x3、5x5、7x7等。其中,3x3的卷積核是最常用的,它的中心點(diǎn)權(quán)重最大,周圍點(diǎn)權(quán)重逐漸減小。

?

同一尺寸的卷積核可以有不同的形式的權(quán)重比例,這些權(quán)重比例會(huì)決定卷積核對(duì)圖像不同區(qū)域的關(guān)注程度。在高斯濾波中,卷積核的權(quán)重比是根據(jù)高斯函數(shù)計(jì)算得出的。高斯函數(shù)是一個(gè)鐘形曲線,它的中心點(diǎn)權(quán)重最大,兩側(cè)的權(quán)重逐漸減小。

卷積核的歸一化

在實(shí)際使用過(guò)程中,往往需要對(duì)卷積核進(jìn)行歸一化,以保證濾波效果的正確性。在高斯濾波中,卷積核的所有權(quán)重值都需要縮放到相同的范圍內(nèi),并且總和為1,以保證卷積操作對(duì)圖像的影響是平衡的,避免某些權(quán)重過(guò)大或過(guò)小導(dǎo)致濾波結(jié)果出現(xiàn)偏差。

結(jié)論

卷積核是圖像處理中非常重要的概念,它可以通過(guò)卷積操作實(shí)現(xiàn)濾波、邊緣檢測(cè)等功能。在高斯濾波中,卷積核的大小、權(quán)重比例和歸一化等因素都會(huì)影響濾波效果。因此,需要根據(jù)實(shí)際情況選擇合適的卷積核,并對(duì)卷積核進(jìn)行適當(dāng)?shù)恼{(diào)整,以滿足不同的圖像處理需求。

Opencv實(shí)現(xiàn)高斯濾波

def GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None):

在Opencv中,我們可以使用cv2.GaussianBlur()函數(shù)來(lái)實(shí)現(xiàn)高斯濾波。使用該函數(shù)時(shí),需要輸入原始圖像、卷積核的大小、沿著x軸、y軸方向的高斯核標(biāo)準(zhǔn)差以及邊界樣式等參數(shù)。其中sigmaY和borderType是可選參數(shù),sigmaX是必選參數(shù),但是可以將該參數(shù)設(shè)置為 0,讓函數(shù)自己去計(jì)算 sigmaX 的具體值。

import cv2 import numpy as np import pyps.pyzjr.utility as zjr path = 'Images/Colnoiselena.jpg'img = cv2.imread(path) imgGaussianBlur_1=cv2.GaussianBlur(img,(1,1),0,0) imgGaussianBlur_3=cv2.GaussianBlur(img,(3,3),0,0) imgGaussianBlur_5=cv2.GaussianBlur(img,(5,5),0,0) imgGaussianBlur_7=cv2.GaussianBlur(img,(7,7),0,0)imgStack = zjr.stackImages(0.6, ([imgGaussianBlur_1, imgGaussianBlur_3], [imgGaussianBlur_5, imgGaussianBlur_7])) cv2.imshow("imges",imgStack) cv2.waitKey(0) cv2.destroyAllWindows()

實(shí)現(xiàn)效果:?

一般情況下,卷積核大小和高斯核標(biāo)準(zhǔn)差是需要根據(jù)實(shí)際場(chǎng)景進(jìn)行調(diào)整的。如果需要對(duì)圖像進(jìn)行更強(qiáng)的模糊處理,可以增加sigma值和卷積核的大小;如果需要對(duì)圖像進(jìn)行較弱的模糊處理,可以減小sigma值和卷積核的大小。

Python手寫實(shí)現(xiàn)高斯濾波

import cv2 import numpy as np import pyps.pyzjr.utility as zjr path = 'Images/Colnoiselena.jpg' img = cv2.imread(path)def gaussian_kernel(size, sigma):kernel = np.zeros((size, size), dtype=np.float32)center = size // 2for i in range(size):for j in range(size):x, y = i - center, j - centerkernel[i, j] = np.exp(-(x**2 + y**2)/(2*sigma**2))kernel /= 2 * np.pi * sigma**2kernel /= np.sum(kernel)return kerneldef Gaussian_Filtering(img, kernel_size, sigma):kernel = gaussian_kernel(kernel_size, sigma)height, width, channels = img.shaperesult = np.zeros_like(img, dtype=np.float32)pad_size = kernel_size // 2img_pad = np.pad(img, [(pad_size, pad_size), (pad_size, pad_size), (0, 0)], mode='constant')for c in range(channels):for i in range(pad_size, height + pad_size):for j in range(pad_size, width + pad_size):result[i - pad_size, j - pad_size, c] = np.sum(kernel * img_pad[i - pad_size:i + pad_size + 1, j - pad_size:j + pad_size + 1, c])return np.uint8(result)imgGaussianBlur_1 = Gaussian_Filtering(img, 1, 1.5) imgGaussianBlur_3 = Gaussian_Filtering(img, 3, 1.5) imgGaussianBlur_5 = Gaussian_Filtering(img, 5, 1.5) imgGaussianBlur_7 = Gaussian_Filtering(img, 7, 1.5) imgStack = zjr.stackImages(0.6, ([imgGaussianBlur_1, imgGaussianBlur_3], [imgGaussianBlur_5, imgGaussianBlur_7])) cv2.imshow("imges",imgStack) cv2.waitKey(0) cv2.destroyAllWindows()

與手寫實(shí)現(xiàn)均值濾波的情況大致相同,還是計(jì)算速度比較慢的情況,不過(guò)這里從效果來(lái)看,又是相差不大。

下面是這個(gè)函數(shù)的具體實(shí)現(xiàn)過(guò)程:?

  • 定義一個(gè)高斯核:首先通過(guò) gaussian_kernel() 函數(shù)生成一個(gè)高斯核,該函數(shù)根據(jù)輸入的 size 和 sigma 參數(shù)生成一個(gè)高斯核,其中 size 表示高斯核的大小, sigma 表示高斯核的標(biāo)準(zhǔn)差。

  • 對(duì)圖像進(jìn)行補(bǔ)零:由于高斯濾波是在圖像的像素周圍應(yīng)用高斯核,因此需要對(duì)圖像進(jìn)行補(bǔ)零處理,以便在圖像的邊緣區(qū)域進(jìn)行高斯卷積時(shí)不會(huì)出現(xiàn)越界的情況。這里使用 np.pad() 函數(shù)來(lái)實(shí)現(xiàn)對(duì)圖像的補(bǔ)零操作,其中只對(duì)高和寬兩個(gè)維度進(jìn)行填充,通道維度不進(jìn)行填充。

  • 實(shí)現(xiàn)高斯卷積:對(duì)于每一個(gè)像素,將以它為中心的區(qū)域和高斯核進(jìn)行卷積,這里使用嵌套的三重循環(huán)對(duì)圖像進(jìn)行遍歷,其中 c 表示圖像的通道數(shù), i 和 j 表示當(dāng)前像素的位置。

  • 將卷積結(jié)果存儲(chǔ)在結(jié)果矩陣中:將卷積的結(jié)果保存在一個(gè)結(jié)果矩陣中,該矩陣與原始圖像具有相同的大小。最后將該結(jié)果矩陣轉(zhuǎn)換為uint8格式并返回。

需要注意的是,在對(duì)圖像進(jìn)行高斯濾波時(shí),應(yīng)該對(duì)每一個(gè)通道分別進(jìn)行處理,因此在高斯卷積的循環(huán)中需要增加一個(gè)針對(duì)通道的循環(huán)。

參考文章

(13條消息) 圖像處理:推導(dǎo)五種濾波算法(均值、中值、高斯、雙邊、引導(dǎo))_高斯濾波,均值濾波,中值濾波_夏天是冰紅茶的博客-CSDN博客

(19條消息) 高斯濾波(Gauss filtering)_半濠春水的博客-CSDN博客

(6條消息) 高斯濾波及其原理_聲希Censh的博客-CSDN博客

總結(jié)

以上是生活随笔為你收集整理的图像处理:高斯滤波算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。