OpenCV 均值平滑(python)

2021-10-09 05:02:30 字數 3674 閱讀 8749

均值平滑,卷積核裡每個值都是一樣的,且相加為1。假如說乙個3*3的卷積核,那麼每個元素為1/9。不用opencv自帶的函式的話,要先求出積分後的影象值,再與卷積核所在的對應位置進行卷積計算,**如下,如果用opencv自帶函式其實只需要一句話,倒數第七行的 b=cv2.blur(blue,(5,5)) 這句,自己編一下有助於理解。

import cv2

import numpy as np

defintegral

(image)

:##對影象進行積分運算

rows,cols=image.shape ##獲取的行數和列數

#行積分運算

inteimagec=np.zeros(

(rows,cols)

,np.float32)

##生成和一樣大的浮點型別陣列

for r in

range

(rows)

:#遍歷行

for c in

range

(cols)

:#遍歷列

if c==0:

inteimagec[r]

[c]=image[r]

[c]else

: inteimagec[r]

[c]=inteimagec[r]

[c-1

]+image[r]

[c]#列積分運算

inteimage=np.zeros(image.shape,np.float32)

for c in

range

(cols)

:for r in

range

(rows)

:if r==0:

inteimage[r]

[c]=inteimagec[r]

[c]else

: inteimage[r]

[c]=inteimage[r-1]

[c]+inteimagec[r]

[c]#上邊和左邊進行補零

inteimage_0=np.zeros(

(rows+

1,cols+1)

,np.float32)

inteimage_0[

1:rows+1,

1:cols+1]

=inteimage

return inteimage_0

deffastmeanblur

(image,winsize,bordertype=cv2.border_reflect)

:##引數:影象,卷積核大小,邊界擴充型別(映象擴充)

halfh=

(winsize[0]

-1)/

2 halfw=

(winsize[1]

-1)/

2 halfh=halfh.astype(np.uint8)

print

("halfh="

,halfh)

halfw=halfw.astype(np.uint8)

print

("halfw"

,halfw)

ratio=

1.0/

(winsize[0]

*winsize[1]

)##計算卷積核資料

print

(ratio)

#邊界擴充

paddimage=cv2.copymakeborder(image,halfh,halfh,halfw,halfw,bordertype)

#影象積分

paddintegral=integral(paddimage)

print

(paddintegral)

#影象的高,寬

rows,cols=image.shape

#均值濾波後的結果

#路徑名中不能有中文,會出錯,cv2.imread_unchanged代表不改變影象樣式型別

blue=cv2.split(a)[0

]##得到影象藍色通道灰度圖

winsize=np.array([5

,5],np.int32)

blurimage=fastmeanblur(blue,winsize,cv2.border_reflect)

print

("blurimage[0,0]"

,blurimage[10,

10])#對影象的灰度值進行處理,因為進行高斯平滑時,資料型別是讀點型,要轉為整型

blurimage=np.

round

(blurimage)

blurimage=blurimage.astype(np.uint8)

print

("blurimage[0,0]"

,blurimage[10,

10]) cv2.imshow(

"blurimage"

,blurimage)

cv2.imshow(

"blue"

,blue)

b=cv2.blur(blue,(5

,5))

###均值濾波blur:核大小是(2,2)也就是每個畫素點周圍2*2個點畫素取均值,稱為核,核越大影象越模糊

cv2.imshow(

"b",b)

cv2.waitkey(

) cv2.destoryallwindows(

)main(

)

原圖:

不用opencv函式:

opencv函式:

在OpenCV裡實現均值平滑2

通過均值可以實現平滑的效果,不過這樣採用卷積的方式來計算還是不夠快,即使是使用了分離的卷積計算。由於均值的特殊性,可以針對這種卷積計算進行優化。我們知道計算均值就是把所有元素加到一起,然後再除以個數。由於影象很大,而卷積運算元很小,那麼就相當於乙個視窗不斷地滑動在影象上,並且計算這個視窗的和,那麼有...

在OpenCV裡實現均值平滑5

從前面來看已經可以把積分影象的功能整合到opencv裡,那麼在它裡面也有相應的均值平滑的函式cv2.blur,這個函式實現的功能與前面實現快速計算平滑的方法是一樣的,只不過它可以處理彩色影象,因為它可以把彩色進行分離成三個顏色的影象進行平滑,再合併回來。它的定義如下 src 輸入影象 dst 輸出影...

opencv 輪廓高斯濾波平滑

乙個小測試的題目 在影象上點選,找到與點選處相鄰的顏色相近的點集合,對該點集合提取輪廓,對該點集合輪廓平滑處理,顯示處理結果。include include using namespace std using namespace cv method findregion 漫水填充 fullname ...