opencv基础入门——模糊操作

非 Y 不嫁゛ 提交于 2019-12-26 15:38:23

参考:

一、模糊原理

使用模糊操作的原因之一就是为了给图像预处理时候降低噪声 , 把噪声与周围的数值平均一下就可以平滑噪声。

模糊基于数学的卷积计算
卷积:通过两个函数f 和g 生成第三个函数的一种数学算子,表征函数ffgg经过翻转和平移的重叠部分的面积。
g(i,j)=l,kf(l+k,j+l)h(k,l)g(i,j)=\sum _{l,k}f(l+k,j+l)h(k,l)

  • 其中:
    f()f()表示一副图像
    i,ji,j表示图像的行和列
    h(k,l)h(k,l)表示卷积算子(卷积核)(也可以叫掩膜)
    k,lk,l又可以叫窗口大小(掩膜的大小,比如3*3)
    g()g()表示输出的像素值

不同的卷积核得到不同的卷积效果
通常这些卷积算子计算都是线性操作,所以又叫线性滤波

二、基本模糊操作

1.均值模糊

import cv2 as cv
import numpy as np

def blur_demo(image):
    """
    均值模糊
    - - - -
    image - 原图像
    """
    # 均值模糊函数:(1,3)分别代表水平模糊和垂直模糊,常用(5,5)
    dst = cv.blur(image, (1, 20))
    cv.imwrite("blur.png", dst)

if __name__ == "__main__":
    src = cv.imread('blurtest.jpeg')
    blur_demo(src)

结果:
在这里插入图片描述

2.中值模糊

def median_blur_demo(image):
    """
    中值模糊
    - - - -
    image - 原图像
    """
    # 中值模糊函数
    dst = cv.medianBlur(image, 5)
    cv.imwrite("median_blur.png", dst)

if __name__ == "__main__":
    src = cv.imread('blurtest.jpeg')
    median_blur_demo(src)

结果:
在这里插入图片描述
可以看出,对于椒盐噪点(有不规则黑白点)图像,中值模糊的去噪效果明显好于均值模糊。

3.自定义模糊

def custom_blur_demo(image):
    """
    自定义模糊
    - - - -
    image - 原图像
    """
    # 自定义卷积核,为了防止像素值溢出,需除25(=5*5*1![在这里插入图片描述](https://img-blog.csdnimg.cn/2019122522022841.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25hbmFzaGlfRg==,size_16,color_FFFFFF,t_70))
    kernel = np.ones([5,5],np.float32)/25
    # 自定义模糊函数:
    dst = cv.filter2D(image,-1,kernel)
    cv.imwrite("custom_blur.png", dst)

if __name__ == "__main__":
    src = cv.imread('blurtest.jpeg')
    blur_demo(src)
    median_blur_demo(src)
    custom_blur_demo(src)

结果:
在这里插入图片描述
可以看出,模糊后结果与均值模糊一致。

另外,还可以通过自定义模糊实现图像锐化的功能,如下(重点是卷积核):

def custom_blur_demo2(image):
    """
    自定义模糊-锐化
    - - - -
    image - 原图像
    """
    # 自定义卷积核
    kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]],np.float32)
    # 自定义模糊函数:(1,3)分别代表水平模糊和垂直模糊
    dst = cv.filter2D(image,-1,kernel)
    cv.imwrite("custom_blur2.png", dst)

if __name__ == "__main__":
    src = cv.imread('cat.jpg')
    custom_blur_demo2(src)

结果:
在这里插入图片描述

三、高斯模糊

1.原理

高斯模糊是一种图像模糊滤波器,它用正态分布计算图像中每个像素的变换。N维空间正态分布方程为
在这里插入图片描述
在二维空间定义为
在这里插入图片描述
其中,r是模糊半径,σ是正态分布的标准偏差。

在二维空间中,这个公式生成的曲面的等高线是从中心开始呈正态分布的同心圆。分布不为零的像素组成的卷积矩阵与原始图像做变换。每个像素的值都是周围相邻像素值的加权平均。
原始像素的值有最大的高斯分布值,所以有最大的权重,相邻像素随着距离原始像素越来越远,其权重也越来越小。
这样进行模糊处理比其它的均衡模糊滤波器更高地保留了边缘效果,参见尺度空间实现。

2.产生高斯噪声

def clamp(pv):
    """
    防止像素溢出
    - - - -
    pv - 像素值 
    """
    if pv > 255:
        return 255
    elif pv < 0:
        return 0
    else:
        return pv

def gaussian_noise(image):
    """
    产生高斯噪声图像
    - - - -
    image - 原图像
    """
    h, w = image.shape[:2]
    for row in range(h):
        for col in range(w):
            # np.random.normal()生成随机正态元组:
            # 0-均值,20-标准差,3-shape
            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])
    cv.imwrite("gaussNoise.jpg", image)

if __name__ == "__main__":
	src = cv.imread('cat.jpg')
    gaussian_noise(src)

结果:
在这里插入图片描述

3.高斯模糊

if __name__ == "__main__":
	src = cv.imread('cat.jpg')
    # 高斯模糊函数
    dst = cv.GaussianBlur(src, (0, 0), 15)
    cv.imwrite("GaussianBlur.png", dst)

结果(毛玻璃效果):
在这里插入图片描述

  • 若对高斯噪声图像使用高斯模糊
if __name__ == "__main__":
	src = cv.imread("gaussNoise.jpg")
    # 高斯模糊函数
    dst = cv.GaussianBlur(src, (0, 0), 3)
    cv.imwrite("GaussianBlur.png", dst)

结果:
在这里插入图片描述
可以看出影响减少了

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!