• 图像阈值与平滑处理


    阈值处理

      ret, dst = cv2.threshold(src, thresh, maxval, type)  

    • src: 输入图,只能输入单通道图像,通常来说为灰度图

    • dst: 输出图

    • thresh: 阈值

    • maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值

    • type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV

    • cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0

    • cv2.THRESH_BINARY_INV THRESH_BINARY的反转

    • cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变

    • cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0

    • cv2.THRESH_TOZERO_INV THRESH_TOZERO的反转

    import cv2 as cv
    import matplotlib.pyplot as plt
    
    
    cat = cv.imread('cat.jpg', cv.COLOR_BGR2GRAY)
    
    ret, thresh1 = cv.threshold(cat, 127, 255, cv.THRESH_BINARY)
    ret, thresh2 = cv.threshold(cat, 127, 255, cv.THRESH_BINARY_INV)
    ret, thresh3 = cv.threshold(cat, 127, 255, cv.THRESH_TRUNC)
    ret, thresh4 = cv.threshold(cat, 127, 255, cv.THRESH_TOZERO)
    ret, thresh5 = cv.threshold(cat, 127, 255, cv.THRESH_TOZERO_INV)
    
    titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
    images = [cat, thresh1, thresh2,thresh3, thresh4, thresh5]
    
    for i in range(6):
        plt.subplot(2, 3, i+1), plt.imshow(images[i], 'gray')
        plt.title(titles[i])
        plt.xticks([]), plt.yticks([])
    View Code

     图像平滑

    • 均值滤波

    均值滤波就是一个简单的平均卷积操作。假设你给的参数是(3, 3),那么他的意思就是用一个3*3大小的核去对图像做卷积,卷积核的值是1。,将他们加起来的值除以总数,在这里是9。然后将归一化的数替换原来的值。

    1 1 1
    1 1 1
    1 1 1
    import cv2 as cv
    import matplotlib.pyplot as plt
    
    
    img = cv.imread('lenaNoise.png')
    cv.imshow('img', img)
    # 均值滤波
    blur = cv.blur(img, (3, 3))
    cv.imshow('blur', blur)
    cv.waitKey(0)
    cv.destroyAllWindows

    下图可以看出均值滤波可以去掉椒盐噪声。

    • 方框滤波

    方框滤波基本上和均值滤波一样,可以归一化。

    import cv2 as cv
    import matplotlib.pyplot as plt
    
    
    img = cv.imread('lenaNoise.png')
    cv.imshow('img', img)
    # 方框滤波
    box = cv.boxFilter(img, -1, (3, 3), normalize = True)
    cv.imshow('box', box)
    cv.waitKey(0)
    cv.destroyAllWindows
    View Code

     可以看出结果和均值滤波一样。下面讲一下函数 box = cv.boxFilter(img, -1, (3, 3), normalize = True) 

     -1 :表示结果通道数和输入图片通道数保持一致

     normalize = True :表示归一化结果再除以总数9。这就是为什么上面的结果和均值滤波一样的原因。

    当 box = cv.boxFilter(img, -1, (3, 3), normalize = False)时,表示结果不出以总数。那么他们相加,如果值大于255,就令最后的值等于255.如果值小于255,就令最后的值保持不变。看结果:

    • 高斯滤波

    import cv2 as cv
    import matplotlib.pyplot as plt
    
    
    img = cv.imread('lenaNoise.png')
    G = cv.GaussianBlur(img, (5, 5), 0)
    cv.imshow('G', G)
    cv.waitKey(0)
    cv.destroyAllWindows()
    View Code

      cv2.GaussianBlur(img, (5, 5), 1)  这里1代表标准差取1。

    高斯滤波的卷积核满足高斯分布,更重视中间的值。 

    • 中值滤波

    import cv2 as cv
    
    
    img = cv.imread('lenaNoise.png')
    median = cv.medianBlur(img, 5)
    cv.imshow('median', median)
    cv.waitKey(0)
    cv.destroyAllWindows()
    View Code

     中值滤波,顾名思义,去矩形范围中的中值。

    • 将多个结果拼接在一起

    np.hstack

    res = np.hstack((blur, G, median))
    cv.imshow('all', res)
    cv.waitKey(0)
    cv.destroyAllWindows()

  • 相关阅读:
    java中split()特殊符号"." "|" "*" "" "]"
    AJAX传递数组
    d3.js+svg的树形图
    d3.js之树形折叠树
    echarts之bootstrap选项卡不能显示其他标签echarts图表
    mysql 将时间戳与日期时间的转换
    ztree使用
    EL表达式之sessionScope
    struts2配置文件中的method={1}详解
    XML创建与解析常用方法介绍
  • 原文地址:https://www.cnblogs.com/missdx/p/12353358.html
Copyright © 2020-2023  润新知