從頭學習opencv(7) 高斯模糊

2021-09-24 14:35:42 字數 2899 閱讀 1866

部落格寫的比較簡單,不過我發現了一下很不錯的博主,看他的可以理解很多學習的時候不明白的地方。這篇文章很多參考了他的部落格p/9097231.html

#高斯雜訊

def gaussian_noise(image):

h,w,c=image.shape

for row in range(h):

for col in range(w):

s=np.random.normal(0,20,3)

b=image[row,col,0]#blue

g=image[row,col,1]#green

r=image[row,col,2]#red

image[row, col, 0] = clamp(b + s[0])

image[row, col, 1] = clamp(g + s[1])

image[row, col, 2] = clamp(r + s[2])

cv.imshow("gaussian_noise",image)

1.高斯模糊實質上就是一種均值模糊,只是高斯模糊是按照加權平均的,距離越近的點權重越大,距離越遠的點權重越小。通俗的講,高斯濾波就是對整幅影象進行加權平均的過程,每乙個畫素點的值,都由其本身和鄰域內的其他畫素值經過加權平均後得到。

2.高斯分布的一維和二維原理如下:

補:高斯分布的標準差σ。標準差代表著資料的離散程度,如果σ較小,那麼生成的模板的中心係數較大,而周圍的係數較小,這樣對影象的平滑效果就不是很明顯;反之,σ較大,則生成的模板的各個係數相差就不是很大,比較類似均值模板,對影象的平滑效果比較明顯。高斯模糊具體原理見博文:

#高斯模糊

#如果前面設定了值,後面的就不起作用

#dst=cv.gaussianblur(src,(0,0),15)

dst=cv.gaussianblur(src,(5,5),0)

#修改之後,輸出沒有那麼模糊,說明高斯模糊對高斯雜訊有抑制作用

高斯模糊gaussianblur函式原型:gaussianblur(src, ksize, sigmax[, dst[, sigmay[, bordertype]]]) -> dst

src引數表示待處理的輸入影象。

ksize引數表示高斯濾波器模板大小。 ksize.width和ksize.height可以不同,但它們都必須是正數和奇數。或者,它們可以是零,即(0, 0),然後從σ計算出來。

sigmax引數表示 x方向上的高斯核心標準差。

sigmay引數表示 y方向上的高斯核心標準差。 如果sigmay為零,則設定為等於sigmax,如果兩個sigma均為零,則分別從ksize.width和ksize.height計算得到。

補:若ksize不為(0, 0),則按照ksize計算,後面的sigmax沒有意義。若ksize為(0, 0),則根據後面的sigmax計算ksize

numpy包裡的random模組用於生成隨機數,random模組裡的normal函式表示的是生成高斯隨機數。

normal函式預設原型:normal(loc=0.0, scale=1.0, size=none)。

loc引數表示高斯分布的中心點。

scale引數表示高斯分布的標準差σ。

size引數表示產生隨機數的個數。size取值可以為(m,n,k),表示繪製mnk個樣本。

import cv2 as cv

import numpy as np

#防止pv值超出255溢位

def clamp(pv):

if pv>255:

return 255

if pv<0:

return 0

else:

return pv

#高斯雜訊

def gaussian_noise(image):

h,w,c=image.shape

for row in range(h):

for col in range(w):

s=np.random.normal(0,20,3)

b=image[row,col,0]#blue

g=image[row,col,1]#green

r=image[row,col,2]#red

image[row, col, 0] = clamp(b + s[0])

image[row, col, 1] = clamp(g + s[1])

image[row, col, 2] = clamp(r + s[2])

cv.imshow("gaussian_noise",image)

src = cv.imread("c:/users/administrator/desktop/demo.png")

cv.namedwindow("input image", cv.window_autosize)

cv.imshow("input image", src)

t1=cv.gettickcount()

gaussian_noise(src)

t2=cv.gettickcount()

time=(t2-t1)/cv.gettickfrequency()

print("time consume:%s"%(time*1000))

#高斯模糊

#如果前面設定了值,後面的就不起作用

#dst=cv.gaussianblur(src,(0,0),15)

dst=cv.gaussianblur(src,(5,5),0)

#修改之後,輸出沒有那麼模糊,說明高斯模糊對高斯雜訊有抑制作用

cv.imshow("gaussian blur",dst)

cv.waitkey(0)

cv.destroyallwindows()

print("hi,python!")

Opencv之高斯模糊

一 高斯模糊 二 實驗 這裡 高斯模糊本質上是低通濾波器,輸出影象的每個畫素點是原影象上對應畫素點與周圍畫素點的加權和,原理並不複雜。做久了卷積神經網路看這個分外親切,就是用高斯分布權值矩陣與原始影象矩陣做卷積運算而已。摘錄wiki上兩段原文 數學上講,對影象做高斯模糊等同於將影象與高斯函式卷積。由...

opencv學習筆記(8)高斯雜訊與高斯模糊

常見的雜訊 高斯 泊松和椒鹽雜訊 大學本科階段,大二左右一般都會教的,對這個不了解可以出門右轉補一下課,可能會方便後續的理解。1.對於np.random.normal有疑問的可以參考這篇部落格 侵刪 python中的np.random.normal 2.np.clip x,a min,a max 相...

OpenCV7 形態學操作

影象a和結構元素b,結構元素b在a上面移動,其中b定義其中心為錨點,計算b覆蓋下a的最大畫素值用來替換錨點的畫素 與膨脹操作類似以最小值替換錨點重疊下影象的畫素值 dilate src,dst,kernel erode src,dst,kernel 獲取結構元素 getstructuringelem...