日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图像处理:高斯滤波算法

發布時間:2024/3/13 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像处理:高斯滤波算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

前言

概念介紹

基本原理

卷積核的大小

卷積核的形狀和權重比

卷積核的歸一化

結論

Opencv實現高斯濾波

Python手寫實現高斯濾波

參考文章


前言

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

概念介紹

高斯濾波是一種常用的圖像處理技術,常用于去噪、平滑和邊緣檢測等應用中。它是基于高斯函數的概念,由于高斯函數的性質,距離中心像素越遠的像素對新值的貢獻越小,對圖像中的像素進行加權平均處理,使得周圍像素的影響比較大,而遠離中心像素的影響則較小。因此,高斯濾波可以平滑圖像并去除一部分噪聲,同時保留圖像中的邊緣和細節。

具體來說,高斯濾波是通過一個矩陣(卷積核)來實現的。這個矩陣的值是由高斯函數計算出來的,高斯函數在中心點處取得最大值,隨著距離的增加而逐漸減小。矩陣的大小和參數的選擇取決于需要處理的圖像和要達到的效果。

基本原理

這里以一個3x3的卷積核為例,卷積核的值是由高斯函數計算出來的,高斯函數在中心點處取得最大值,隨著距離的增加而逐漸減小。通過對每個像素應用卷積核,高斯濾波可以對圖像進行平滑處理并去除噪聲,同時保留圖像的細節和邊緣。

如上圖所示,高斯函數在中心點處的值最大,離中心點越遠的值越小。這意味著對于每個像素,距離中心像素越遠的像素對新值的影響越小。這種影響方式使得高斯濾波可以去除圖像噪聲,同時保留圖像細節和邊緣。

通過高斯濾波的計算過程,可以得出中心點像素值226被新值164所替代的結果。具體來說,通過一個簡單的矩陣點乘計算,將卷積核與圖像中的像素矩陣相乘,得出每個像素的新值。

它的計算過程如下所示:

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大小的卷積核為例,這里就詳細補充一些有關于卷積核的知識。

卷積核的形狀和權重比

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

?

同一尺寸的卷積核可以有不同的形式的權重比例,這些權重比例會決定卷積核對圖像不同區域的關注程度。在高斯濾波中,卷積核的權重比是根據高斯函數計算得出的。高斯函數是一個鐘形曲線,它的中心點權重最大,兩側的權重逐漸減小。

卷積核的歸一化

在實際使用過程中,往往需要對卷積核進行歸一化,以保證濾波效果的正確性。在高斯濾波中,卷積核的所有權重值都需要縮放到相同的范圍內,并且總和為1,以保證卷積操作對圖像的影響是平衡的,避免某些權重過大或過小導致濾波結果出現偏差。

結論

卷積核是圖像處理中非常重要的概念,它可以通過卷積操作實現濾波、邊緣檢測等功能。在高斯濾波中,卷積核的大小、權重比例和歸一化等因素都會影響濾波效果。因此,需要根據實際情況選擇合適的卷積核,并對卷積核進行適當的調整,以滿足不同的圖像處理需求。

Opencv實現高斯濾波

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

在Opencv中,我們可以使用cv2.GaussianBlur()函數來實現高斯濾波。使用該函數時,需要輸入原始圖像、卷積核的大小、沿著x軸、y軸方向的高斯核標準差以及邊界樣式等參數。其中sigmaY和borderType是可選參數,sigmaX是必選參數,但是可以將該參數設置為 0,讓函數自己去計算 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()

實現效果:?

一般情況下,卷積核大小和高斯核標準差是需要根據實際場景進行調整的。如果需要對圖像進行更強的模糊處理,可以增加sigma值和卷積核的大小;如果需要對圖像進行較弱的模糊處理,可以減小sigma值和卷積核的大小。

Python手寫實現高斯濾波

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()

與手寫實現均值濾波的情況大致相同,還是計算速度比較慢的情況,不過這里從效果來看,又是相差不大。

下面是這個函數的具體實現過程:?

  • 定義一個高斯核:首先通過 gaussian_kernel() 函數生成一個高斯核,該函數根據輸入的 size 和 sigma 參數生成一個高斯核,其中 size 表示高斯核的大小, sigma 表示高斯核的標準差。

  • 對圖像進行補零:由于高斯濾波是在圖像的像素周圍應用高斯核,因此需要對圖像進行補零處理,以便在圖像的邊緣區域進行高斯卷積時不會出現越界的情況。這里使用 np.pad() 函數來實現對圖像的補零操作,其中只對高和寬兩個維度進行填充,通道維度不進行填充。

  • 實現高斯卷積:對于每一個像素,將以它為中心的區域和高斯核進行卷積,這里使用嵌套的三重循環對圖像進行遍歷,其中 c 表示圖像的通道數, i 和 j 表示當前像素的位置。

  • 將卷積結果存儲在結果矩陣中:將卷積的結果保存在一個結果矩陣中,該矩陣與原始圖像具有相同的大小。最后將該結果矩陣轉換為uint8格式并返回。

需要注意的是,在對圖像進行高斯濾波時,應該對每一個通道分別進行處理,因此在高斯卷積的循環中需要增加一個針對通道的循環。

參考文章

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

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

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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。