[python-opencv] 模糊操作
@不要在奋斗的年纪 选择安逸
均值模糊
- 中值模糊
- 自定义模糊
- 意义与应用场景
模糊的基本原理:
1、基于离散卷积
2、定义好每个卷积核
3、不同卷积核得到不同的卷积效果
4、模糊是卷积的一种表象
#均值模糊 (2,8)高模糊2 宽模糊8 def blur_demo(image): dst = cv.blur(image,(2,8)) cv.imshow('blur_demo',dst) #中值模糊 适合椒盐噪声去噪 def median_blur_demo(image): dst = cv.medianBlur(image,5) cv.imshow('median_blur_demo',dst) #自定义模糊 def customer_blur_demo(image): #定义卷积核---均值模糊的效果 # kernel = np.ones([5,5],np.float32/25) # 定义卷积核---锐化 kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float32)
dst = cv.filter2D(image,-1,kernel=kernel) cv.imshow('customer_blur_demo',dst)
高斯噪点
高斯分布的概率密度函数
numpy.random.normal(loc=0.0, scale=1.0, size=None)
参数的意义为:
loc:float
概率分布的均值,对应着整个分布的中心center
scale:float
概率分布的标准差,对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高
size:int or tuple of ints
输出的shape,默认为None,只输出一个值,可以指定输出值个数返回列表
我们更经常会用到np.random.randn(size)所谓标准正太分布(μ=0, σ=1),对应于np.random.normal(loc=0, scale=1, size)
n = np.random.normal(0,8,4) print(n) ##[ -5.65830268 4.27277753 2.97616802 -15.1577604 ]
#定义高斯噪声 def gaussian_noise(image): h,w,ch = image.shape for row in range(h): for col in range(w): s = np.random.normal(0,20,3) #均值为0 方差为20 输出3个值 b = image[row,col,0] #blue g = image[row,col,1] #green r = image[row,col,2] #red # 给blue层加上正态分布噪点 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('noise image',image)
"""高斯模糊:这里(5, 5)表示高斯矩阵的长与宽都是5 标准差取6,当取尺寸(5,5)时标准差失效、当取尺寸(0,0)时标准差有效。并且高斯矩阵的尺寸越大或者标准差越大,处理过的图像模糊程度越大""" dst = cv.GaussianBlur(src,(5,5),6) cv.imshow('Gaussian Blur1',dst) dst = cv.GaussianBlur(src,(0,0),10) cv.imshow('Gaussian Blur2',dst)
EPF(Edge Preserver Filter)边缘保留滤波
高斯模糊只考虑了权重,只考虑了像素空间的分布,没有考虑像素值和另一个像素值之间差异的问题,如果像素间差异较大的情况下(比如图像的边缘),高斯模糊会进行处理,但是我们不需要处理边缘,要进行的操作就叫做边缘保留滤波(EPF)
知识点:边缘轮廓差异较大的时候得到保留、
案例:
""" #EPF-高斯双边滤波 其中各参数所表达的意义: src:原图像; d:像素的邻域直径,可有sigmaColor和sigmaSpace计算可得; sigmaColor:颜色空间的标准方差,一般尽可能大; sigmaSpace:坐标空间的标准方差(像素单位),一般尽可能小。 """ def bi_demo(image): dst = cv.bilateralFilter(image,0,150,10) cv.imshow('bilateralFilter',dst) """ #EPF-均值偏移滤波 其中各参数所表达的意义: src:原图像; sp:空间窗的半径(The spatial window radius); sr:色彩窗的半径(The color window radius); 注意: 通过均值迁移来进行边缘保留滤波有时会导致图像过度模糊 """ def shift_demo(image): dst = cv.pyrMeanShiftFiltering(image,10,50) cv.imshow('pyrMeanShiftFiltering',dst)