美文网首页
OpenCV+Python图像滤波(平滑)+ 金字塔思想

OpenCV+Python图像滤波(平滑)+ 金字塔思想

作者: 音符纸飞机 | 来源:发表于2018-07-11 00:36 被阅读70次

    图像处理中的滤波一般用于消除噪声,增强图像。

    图像卷积(滤波)

    数字图像是一个二维的离散信号,对数字图像做卷积操作其实就是利用卷积核(卷积模板)在图像上滑动,将图像点上的像素灰度值与对应的卷积核上的数值相乘,然后将所有相乘后的值相加作为卷积核中间像素对应的图像上像素的灰度值,并最终滑动完所有图像的过程。

    dst = cv2.filter2D(img, ddepth, kernel)
    # img为原图像
    # ddepth是目标图像的图像深度,如CV_8U, CV_16U/CV_16S, CV_32F, CV_64F
    #   -1表示与原图像深度一致。目标图像的深度必须大于等于原图像
    # kernel 卷积核
    
    实例
    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    img = cv2.imread('../laugh.jpg', 0)
    
    kernel = np.ones((5, 5), np.float32) / 25
    dst = cv2.filter2D(img, -1, kernel)
    
    plt.subplot(121), plt.imshow(img, cmap='gray'), plt.title('Original')
    plt.xticks([]), plt.yticks([])
    plt.subplot(122), plt.imshow(dst, cmap='gray'), plt.title('Averaging')
    plt.xticks([]), plt.yticks([])
    plt.show()
    
    平均滤波

    图像平滑(图像模糊)

    图像平滑主要用的是低通滤波器,用于降噪,过滤图像中的高频信息,比如边界。OpenCV中实现了多种常用的低通滤波器。

    平均滤波

    dst = cv2.blur(img, kernel_size)
    # 如(3,3)表示 [[1,1,1],[1,1,1],[1,1,1]]/9 的卷积核
    

    高斯滤波

    dst = cv2.GaussianBlur(img, kernel_size, sigma_X, sigma_Y=None, borderType=None)
    # sigma_X 高斯卷积和在X方向上的标准差。
    # sigma_Y的默认值表示与sigma_X相同
    # 若sigma设为0, 会使用这个公式计算sigma: 0.3*((kernel_size-1)*0.5 - 1) + 0.8
    # borderType 边缘扩展点插值类型,见cv2.BORDER_*
    
    高斯函数
    模拟人眼,关注中心区域,标准差\sigma越大,关注的区域越大,中心权重越低

    卷积核可以拆分,减少计算量

    中值滤波

    去除椒盐噪声

    dst = cv2.medianBlur(img, ksize)
    # ksize必须是大于1的奇数
    

    双边滤波(Bilateral Filter)

    作用:过滤噪声的同时,保留边缘信息

    • 双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空间与信息和灰度相似性,达到保边去噪的目的,具有简单、非迭代、局部处理的特点。之所以能够达到保边去噪的滤波效果是因为滤波器由两个函数构成:一个函数是由几何空间距离决定滤波器系数,另一个是由像素差值决定滤波器系数。
    • 双边滤波的权重不仅考虑了像素的欧氏距离(如普通的高斯低通滤波,只考虑了位置对中心像素的影响),还考虑了像素范围域中的辐射差异(例如卷积核中像素与中心像素之间相似程度、颜色强度,深度距离等),在计算中心像素的时候同时考虑这两个权重。
    cv2.bilateralFilter(src, d, sigma_color, sigma_space)
    # d 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会根据sigma_space计算该值。 
    # sigma_color 颜色空间过滤器的sigma值
    #       这个参数的值越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
    # sigma_space  坐标空间中滤波器的sigma值
    #       如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。
    #       当d>0时,d指定了邻域大小且与sigma_space无关,否则d正比于sigmaSpace。
    # d越大,算法耗时越长
    

    对于彩色图片,由于两种颜色中可能有其他完全不同的颜色,因此不像灰度图那样,仅仅是 blurred ,而是会产生 auras like 的奇怪的晕圈,所以在双边滤波的过程中,将RGB转换到 CIE-Lab 色彩空间,这个空间与人的主管色彩辨识能力相关,因此可以改善这一缺陷。

    效果
    import cv2
    from matplotlib import pyplot as plt
    # 以GBR颜色模型导入图像
    img = cv2.imread('laugh.jpg')
    # pyplot绘图时,彩色图像的信道顺序与opencv的不同,所以为了正常显示,必须改变颜色信道的顺序
    b, g, r = cv2.split(img)
    img = cv2.merge((r, g, b))
    
    cv2.imshow("original", img)
    dst1 = cv2.blur(img, (21, 21))
    dst2 = cv2.GaussianBlur(img, (21, 21), 0)
    dst3 = cv2.medianBlur(img, 21)
    dst4 = cv2.bilateralFilter(img, 21, 75, 75)
    titles = ["Original", "blur", "gaussian", "median", "bilateral"]
    imgs = [img, dst1, dst2, dst3, dst4]
    for i in range(5):
        plt.subplot(3, 2, i + 1), plt.imshow(imgs[i]), plt.title(titles[i])
        plt.xticks([]), plt.yticks([])
    plt.show()
    
    多种平滑滤波效果对比图

    金字塔

    降采样

    金字塔其实就是降采样,但是直接降采样会损失信息,需要配合高斯滤波


    原图、直接降采样、高斯+降采样
    尺度空间

    不同尺度适合不同尺寸的物体,合适的尺度永远未知。

    拉普拉斯金字塔

    高频细节在采样过程中被丢失,拉普拉斯金字塔会保留所有层所丢失的高频信息,用于图像恢复

    中间一层就是保留的丢失的高频信息

    相关文章

      网友评论

          本文标题:OpenCV+Python图像滤波(平滑)+ 金字塔思想

          本文链接:https://www.haomeiwen.com/subject/ibhcpftx.html