數學之路-python計算實戰(15)-機器視覺-濾波去噪(歸一化塊濾波)
阿新 • • 發佈:2019-01-05
# -*- coding: utf-8 -*- #code:[email protected] #歸一化塊濾波 import cv2 import numpy as np fn="test3.jpg" myimg=cv2.imread(fn) img=cv2.cvtColor(myimg,cv2.COLOR_BGR2GRAY) #加上高斯噪聲,可以參考以前博文中的內容 ...... ...... #濾波去噪 lbimg=cv2.blur(newimg,(3,3)) cv2.imshow('src',newimg) cv2.imshow('dst',lbimg) cv2.waitKey() cv2.destroyAllWindows()
右圖是加上噪聲,左圖是去除噪聲後,雖然進行了影象模糊,但仍能比較清晰
根據原理,使用第3個脈衝響應函式(也有人稱它為核函式),如下:
本部落格所有內容是原創,如果轉載請註明來源
用python實現這個演算法
#code:[email protected] #歸一化塊濾波 ... ... #用第3個脈衝響應函式 a=1/16.0 kernel=a*np.array([[1,2,1],[2,4,2],[1,2,1]]) for y in xrange(1,myh-1): for x in xrange(1,myw-1): lbimg[y,x]=np.sum(kernel*tmpimg[y-1:y+2,x-1:x+2]) print ".",
效果如下圖
opencv提供的blur函式使用說明如下 :
Blurs an image using the normalized box filter.
- C++:void blur(InputArray src, OutputArray dst, Size ksize, Pointanchor=Point(-1,-1), int borderType=BORDER_DEFAULT )
- Python:cv2.blur(src, ksize[, dst[, anchor[, borderType]]]) → dst
Parameters: - src – input image; it can have any number of channels, which are processed independently, but the depth should be CV_8U
- dst – output image of the same size and type as src.
- ksize – blurring kernel size.
- anchor – anchor point; default value Point(-1,-1) means that the anchor is at the kernel center.
- borderType – border mode used to extrapolate pixels outside of the image.
- src – input image; it can have any number of channels, which are processed independently, but the depth should be CV_8U
注意,blur函式使用了第1個脈衝響應函式,如下:
The function smoothes an image using the kernel:
對椒鹽噪聲的歸一化塊濾波濾波,需要將作用域擴大,但會更模糊,但效果更好# -*- coding: utf-8 -*-
#code:[email protected]
#歸一化塊濾波
import cv2
import numpy as np
fn="test3.jpg"
myimg=cv2.imread(fn)
img=cv2.cvtColor(myimg,cv2.COLOR_BGR2GRAY)
#加上椒鹽噪聲
#灰階範圍
w=img.shape[1]
h=img.shape[0]
newimg=np.array(img)
#噪聲點數量
noisecount=100000
for k in xrange(0,noisecount):
xi=int(np.random.uniform(0,newimg.shape[1]))
xj=int(np.random.uniform(0,newimg.shape[0]))
newimg[xj,xi]=255
#濾波去噪
lbimg=cv2.blur(newimg,(5,5))
cv2.imshow('src',newimg)
cv2.imshow('dst',lbimg)
cv2.waitKey()
cv2.destroyAllWindows()