• 高通滤波器与低通滤波器


     高通滤波器

    以检测边缘的高通过滤器为例

    这是个三乘三的核 其元素总和为 0,边缘检测时 所有元素总和为 0 是很重要的,因为这类过滤器要计算的是相邻像素的差异 或者说变化,要计算差异 就需要将像素值相减,如果这些核值加起来不等于 0,那就意味着计算出来的差,权重会有正负结果就是滤波后的图像亮度会相应地提高或降低,这就是卷积核元素相加为零的原因。

    import numpy as np
    import matplotlib.pyplot as plt
    import cv2
    %matplotlib inline
    image = cv2.imread('1.png')
    image_copy = np.copy(image)
    image_copy = cv2.cvtColor(image_copy,cv2.COLOR_BGR2RGB)
    plt.imshow(image_copy)

    gray = cv2.cvtColor(image_copy,cv2.COLOR_RGB2GRAY)
    plt.imshow(gray,cmap='gray')

    sobel_x = np.array([[-1,0,1],
                       [-2,0,2],
                       [-1,0,1]])    #sobel filter
    filtered = cv2.filter2D(gray,-1,sobel_x) #-1表示输入和输出类型一致
    plt.imshow(filtered,cmap='gray')

    retval,binary_image = cv2.threshold(filtered,100,255,cv2.THRESH_BINARY)
    plt.imshow(binary_image,cmap='gray')
    print(retval) #不知道这个retval有什么用,输出看一下

    低通滤波器

     高通滤波器检测边缘时不仅会检测到噪声,而且还会强化它们,所以在高通滤波之前,需要先降噪。
    低通滤器通常会取均值 不像高通过滤器取的是差值,因此低通过滤器的元素加起来应该为 1,这就能保留图像的亮度,确保图像不会变亮或变暗,但我们可以看到 这个核的元素加起来等于 9,所以我们需要进行归一化处理 也就是将核值总和除以 9

    有时我们会想要个既能模糊图像 又能更好地保存图像边缘的过滤器,为此 我们可用高斯模糊,这或许是计算机视觉应用中最常用的低通过滤器了。高斯低通过滤器其实就是加权平均法 赋予中心像素最大的权重,但也会考虑到周围的像素 权重多少主要取决于周围像素有多接近中心像素

    import numpy as np
    import cv2
    import matplotlib.pyplot as plt
    %matplotlib inline
    image = cv2.imread('2.png')
    image_copy = np.copy(image)
    image_copy = cv2.cvtColor(image_copy,cv2.COLOR_BGR2RGB)
    plt.imshow(image_copy)

    对图像进行高斯滤波,比较两者

    gray = cv2.cvtColor(image_copy,cv2.COLOR_RGB2GRAY)
    gray_blur = cv2.GaussianBlur(gray,(5,5),0)
    f,(ax1,ax2) = plt.subplots(1,2,figsize=(20,10))
    ax1.set_title('original gray')
    ax1.imshow(gray,cmap='gray')
    ax2.set_title('blurred image')
    ax2.imshow(gray_blur,cmap='gray')

    对未模糊处理的灰度图像和经过模糊处理的图像分别进行高通滤波操作 比较两者的效果

    sobel_y = np.array([[2,1,2],
                       [0,0,0],
                       [-2,-1,-2]])
    filtered = cv2.filter2D(gray,-1,sobel_y)
    filtered_blurred = cv2.filter2D(gray_blur,-1,sobel_y)
    f,(ax1,ax2) = plt.subplots(1,2,figsize=(20,10))
    ax1.set_title('original gray')
    ax1.imshow(filtered,cmap='gray')
    ax2.set_title('blurred image')
    ax2.imshow(filtered_blurred,cmap='gray')

     可以看到未模糊处理的图像,噪声更多 而模糊处理后的图像边缘检测效果更准确

    通常来讲 对于这个图像以及其它诸多图像,我们都会先对图像进行小型低通滤波处理,比如应用高斯模糊 从而去除噪声,然后再用高通过滤器来检测边缘,所以在对图像进行滤波处理时 要牢牢记住这个顺序

  • 相关阅读:
    C#多线程参数传递
    Delphi单元测试工具Dunit介绍
    使用javascript生成文件
    Windows自动登录源码
    [Win32]一个调试器的实现
    用MASM写一个简单的实现递归操作的汇编程序,所谓递归,上课已经跟大家说清楚了,如果我们只考虑简单的只分一次的递
    C#多线程编程(4)多线程与UI操作
    在Delphi中实现类型安全的容器,Delphi泛型库DGL引介(提供源码下载) .
    delphi 中几种多线程操作方式
    C#实现WEB服务器
  • 原文地址:https://www.cnblogs.com/roscangjie/p/10829351.html
Copyright © 2020-2023  润新知