[python-opencv] 模糊操作

Posted 熊出没

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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)

 

以上是关于[python-opencv] 模糊操作的主要内容,如果未能解决你的问题,请参考以下文章

python-opencv-图像毛玻璃模糊效果

python-opencv性能衡量和提升技术

Python-OpenCV下的窗口鼠标事件交互操作(实现鼠标移动轨迹的绘制)

python-opencv-像素操作

Python-OpenCV基本操作cv2

python-opencv-视频的读取与分解