OpenCV——阈值处理+平滑处理

© Fu Xianjun. All Rights Reserved.

文章目录

    • 一、阈值处理
      • 1、二值化阈值处理[cv2.threshold()]
      • 2、自适应阈值[cv2.adaptiveThreshold()]
      • 3、Otsu阈值处理[cv2.threshold()]
        • 例题
    • 二、平滑处理
        • 均值滤波
        • 方框滤波
        • 高斯滤波
        • 中值滤波
        • 双边滤波
        • 2D卷积(自定义滤波)


一、阈值处理

OpenCV使用cv2.threshold()函数进行阈值化处理。
语法格式为:ret, dst = cv2.threshold(src, thresh, maxval, type)

  • src: 输入图,只能输入单通道图像,通常来说为灰度图
  • dst: 输出图
  • thresh: 阈值
  • maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
  • type:二值化操作的类型,包含以下5种类型
    OpenCV——阈值处理+平滑处理_第1张图片

1、二值化阈值处理[cv2.threshold()]

使用函数cv2.threshold()对图像进行二值化阈值处理。

编写代码如下(示例):

import cv2
img = cv2.imread(" ")
t , rst = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey(0)
cv2.destroyAllWindows()

2、自适应阈值[cv2.adaptiveThreshold()]

OpenCV中,函数cv2.adaptiveThreshold()用来实现自适应阈值处理。

  • 定义:使用变化的阈值完成对图像的阈值处理。
  • 操作:通过计算每个像素点周围临近区域的加权平均值获得阈值,并使用该阈值对当前像素点进行处理。
  • 目的:保留了更多的细节信息。

该语法格式为:
dst=cv.adaptiveThreshold (src, maxValue, adaptiveMethod, thresholdType, blockSize, C)

  • dst代表自适应阈值处理结果。
  • src代表要进行处理的原始图像。[!!!该图像必须是8位单通道的图像]
  • maxValue代表最大值。
  • ladaptiveMethod代表自适应方法。
  • lthresholdType 代表阈值处理方式,该值必须是cv2.THRESH_BINARY 或者cv2.THRESH_BINARY_INV中的一个。
  • lblockSize代表块大小。表示一个像素在计算其阈值时所使用的邻域尺寸,通常为3、5、7等。
  • C是常量。

编写代码如下(示例):

img=cv2.imread(' ',0)
athdMEAN=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,7,5)
athdGAUS=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,3)
cv2.imshow("athMEAN",athdMEAN)
cv2.imshow("athGAUS",athdGAUS)
cv2.waitKey(0)
cv2.destroyAllWindows()

3、Otsu阈值处理[cv2.threshold()]

Otsu大津

  • 定义:根据当前图像给出最佳的类间分割阈值。
  • 操作:遍历所有可能阈值,从而找到最佳的阈值

语句函数cv2.threshold()采用Otsu方法进行阈值分割:

t,otsu=cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

与普通阈值分割的不同之处在于:

  • 参数type增加了一个参数值“cv2.THRESH_OTSU”。
  • 设定的阈值为0。
  • 返回值t是Otsu方法计算得到并使用的最优阈值。

编写代码如下(示例):

img=cv2.imread(' ',0)
ret,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cv2.imshow("otsu",otsu)
cv2.waitKey(0)
cv2.destroyAllWindows()

例题

  • 对一幅图像进行普通的二值化阈值处理和Otsu阈值处理。

编写代码如下(示例):

import cv2
img = cv2.imread(" ",0)
t1 , thd = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
t2, otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cv2.imshow("img",img)
cv2.imshow("thd",thd)
cv2.imshow("otsu",otsu)
cv2.waitKey()
cv2.destroyAllWindows()

二、平滑处理

图像平滑处理的基本原理是,将噪声所在像素点的像素值处理为其周围临近像素点的值的近似值。取近似值的方式有:

  • 均值滤波
  • 方框滤波
  • 高斯滤波
  • 中值滤波
  • 双边滤波
  • 2D卷积(自定义滤波)

其目标是去除图像内部噪声。

均值滤波

定义:指用当前像素点周围N*N个像素值的均值来代替当前像素值。

通常情况下,使用均值滤波函数时,对于锚点anchor和边界样式borderType,双边滤波直接采用其默认值即可。因此,函数cv2.blur()的一般形式为:dst=cv2.blur(src,ksize,)

  • ksize:滤波核的大小。滤波核大小是指在均值处理过程中,其邻域图像的高度

方框滤波

定义:自由选择是否对均值滤波的结果进行归一化,即可以自由选择滤波结果是邻域像素值之和的平均值,还是邻域像素值之和。

通常情况下,函数cv2.boxFilter()的一般形式为:dst=cv2.boxFilter(src,ddepth,ksize)

  • ddepth是处理结果图像的图像深度,一般使用-1表示与原始图像使用相同的图像深度。

高斯滤波

定义:将中心点的权重值加大,远离中心点的权重值减小,在此基础上计算邻域内各个像素值不同权重的和。

在实际处理中,可以显式指定sigmaX和sigmaY为默认值0。因此,函数双边滤波cv2.GaussianBlur()的常用形式为:dst=cv2.GaussianBlur(src,ksize,0,0)

高斯滤波的作用 : 消除高斯噪声

中值滤波

定义:用邻域内所有像素值的中间值来替代当前像素点的像素值

语法形式为:dst=cv2.medianBlur(src,ksize)

该方法在去除脉冲噪声、椒盐噪声的同时又能保留图像边缘细节

双边滤波

定义:是综合考虑空间信息和色彩信息的滤波方式,在滤波过程中能够有效地保护图像内的边缘信息。

语法形式为:cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace,borderType)

(参数borderType是可选参数,其余参数全部为必选参数)

  • d:在滤波时选取的空间距离参数,这里表示以当前像素点为中心点的直径。如果该值为非正数,则会自动从参数 sigmaSpace 计算得到。
  • sigmaColor:滤波处理时选取的颜色差值范围,该值决定了周围哪些像素点能够参与到滤波中来。
  • sigmaSpace:坐标空间中的sigma值。

2D卷积(自定义滤波)

定义:使用特定的卷积核实现卷积操作。

通常情况下,使用滤波函数cv2.filter2D()时,对于参数锚点anchor、修正值delta、边界样式borderType,直接采用其默认值即可。

函数cv2.filter2D()的常用形式为:dst=cv2.filter2D(src,ddepth,kernel)

  • delta :修正值,它是可选项。如果该值存在,会在基础滤波的结果上加上该值作为最终的滤波处理结果。

–借助numpy库中的ones()函数,设计一个9·9大小的卷积核

编写代码如下(示例):

import cv2
import numpy as np
img = cv2.imread(" ")
kernel = np.ones((9,9),np.float32)/81
r = cv2.filter2D(img,-1,kernel)
cv2.imshow('img',img)
cv2.imshow('filter2D',r)
cv2.waitKey()
cv2.destroyAllWindows()

以上程序会将原始图像以9·9大小的领域进行均值滤波。

你可能感兴趣的:(OpenCV,opencv)