一、模糊操作基本原理
1,基于离散卷积
2,定义好每一个卷积核
3,不同卷积核得到不同的卷积效果
4,模糊是卷积的一种表象
二、1*3卷积核举例
每次右移一格,进行对应相乘再求和。1*3的卷积核左右两边的元素并没有处理而是照搬下来。卷积核一般都奇数。
三、均值模糊
对随机噪声有很好的去噪效果
1,基于平均值的均值模糊
cv2.blur(image,(5,5))
需要传入目标图像,定义卷积核大小
import cv2
import numpy as np
def blur(image):
dst = cv2.blur(image,(5,5))
cv2.imshow("blur",dst)
src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
blur(src)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果图如下:
2,基于权重的高斯模糊
①概念公式
Ⅰ一维高斯正态分布
Ⅱ二维高斯公式
Ⅲ实际上图像是个二维的,若采用二维卷积核去计算的话很耗时,一般采用两个一维卷积核去操作运算
例如二维卷积核
可由和
两个一维卷积核来等效替代
②高斯噪声
实际上就是多个随机点分别对应加上原图像上
import cv2
import numpy as np
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]
g = image[row,col,1]
r = image[row,col,2]
image[row,col,0]=clamp(b+s[0])
image[row,col,1]=clamp(g+s[1])
image[row,col,2]=clamp(r+s[2])
cv2.imshow("noise",image)
src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
t1 = cv2.getTickCount()
gaussian_noise(src)
t2 = cv2.getTickCount()
time = (t2-t1)/cv2.getTickFrequency()# s
print("time is %s"%(time*1000))# ms
cv2.waitKey(0)
cv2.destroyAllWindows()
效果图如下:
③高斯模糊
cv2.GaussianBlur(src,(0,0),15)
15表示公式中的σ的值
import cv2
import numpy as np
src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
dst = cv2.GaussianBlur(src,(0,0),15)
cv2.imshow("GaussianBlur",dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果图如下:
④使用高斯模糊消除高斯噪声
import cv2
import numpy as np
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]
g = image[row,col,1]
r = image[row,col,2]
image[row,col,0]=clamp(b+s[0])
image[row,col,1]=clamp(g+s[1])
image[row,col,2]=clamp(r+s[2])
cv2.imshow("noise",image)
src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
t1 = cv2.getTickCount()
gaussian_noise(src)#给图像加入高斯噪声
t2 = cv2.getTickCount()
time = (t2-t1)/cv2.getTickFrequency()# s
print("time is %s"%(time*1000))# ms
#dst = cv2.GaussianBlur(src,(0,0),15)
dst = cv2.GaussianBlur(src,(5,5),0)#对加入高斯噪声的图像进行高斯模糊操作
cv2.imshow("GaussianBlur",dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果图如下:
二、中值模糊
中值模糊一般用于消除椒盐噪声
cv2.medianBlur(image,5)
需要传入目标图像,卷积核大小
import cv2
import numpy as np
def median_blur(image):
dst = cv2.medianBlur(image,5)
cv2.imshow("median_blur",dst)
src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\l.png")
cv2.imshow("image",src)
median_blur(src)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果图如下:
三、自定义模糊
cv2.filter2D(image,-1,kernel=kernel1)
需要传入目标图像,自定义卷积核
import cv2
import numpy as np
'''
之所以有的需要除以25和除以9,是因为所有的卷积核之和为1才行
'''
def custom_blur(image):
kernel1 = np.ones([5,5],np.float32)/25 #需要满足卷积核之和为1故需要除以25
dst1 = cv2.filter2D(image,-1,kernel=kernel1)
cv2.imshow("custom_blur_1",dst1)
kernel2 = np.array([[1,1,1],[1,1,1],[1,1,1]],np.float32)/9 #需要满足卷积核之和为1故需要除以9
dst2 = cv2.filter2D(image,-1,kernel=kernel2)
cv2.imshow("custom_blur_2",dst2)
kernel3 = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float32)#这个卷积核实际上就是图像的锐化
dst3 = cv2.filter2D(image,-1,kernel=kernel3)
cv2.imshow("custom_blur_3",dst3)
src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
custom_blur(src)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果图如下: