均值平滑,卷積核裡每個值都是一樣的,且相加為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 ...