1087 字
5 分钟
OpenCV:阈值处理

1. 介绍#

​ 阈值处理,指剔除图像内像素值高于一定值或者低于一定值的像素点。通过阈值处理方式,可以将一幅灰度图像处理为一幅二值图像,有效实现了前景和背景的分离。

2. 通用阈值处理#

  • 通过函数cv2.threshold(),实现通用的阈值处理
  • 函数原型retval, dst = cv2.threshold( src, thresh, maxval, type )
  • 参数说明
    • retval返回的阈值
    • dst阈值分割结果图像,与原始图像具有相同的大小和类型。
    • src要进行阈值分割的图像,可以是多通道的8位或32位浮点型数值。
    • thresh设定的阈值
    • maxval:当type参数为THRESH_BINARY或者THRESH_BINARY_INV类型时,需要设定的最大值
    • type阈值分割的类型

阈值分割类型

阈值分割类型·图示

import cv2
src = cv2.imread("person.jpg", cv2.IMREAD_GRAYSCALE)
val, BINARY = cv2.threshold(src=src, thresh=127, maxval=255, type=cv2.THRESH_BINARY)
val, BINARY_INV = cv2.threshold(src=src, thresh=127, maxval=255, type=cv2.THRESH_BINARY_INV)
val, TRUNC = cv2.threshold(src=src, thresh=127, maxval=255, type=cv2.THRESH_TRUNC)
val, TOZERO = cv2.threshold(src=src, thresh=127, maxval=255, type=cv2.THRESH_TOZERO)
val, TOZERO_INV = cv2.threshold(src=src, thresh=127, maxval=255, type=cv2.THRESH_TOZERO_INV)
cv2.imwrite("BINARY.jpg", BINARY)
cv2.imwrite("BINARY_INV.jpg", BINARY_INV)
cv2.imwrite("TRUNC.jpg", TRUNC)
cv2.imwrite("TOZERO.jpg", TOZERO)
cv2.imwrite("TOZERO_INV.jpg", TOZERO_INV)
原图二值化反二值化
原图二值化反二值化
原图截断处理
原图截断处理
原图超阈值零处理低阈值零处理
原图超阈值零处理低阈值零处理

3. Otsu阈值处理#

​ 在使用函数cv2.threshold()进行阈值处理时,需要自定义一个阈值,并以此阈值作为图像阈值处理的依据。通常情况下,处理的图像都是色彩均衡的,这时直接将阈值设为127是比较合适的。但是有时图像灰度级的分布是不均衡的,如果此时还将阈值设置为 127,那么阈值处理的结果就是失败的。Otsu方法能够根据当前图像,给出最佳的类间分割阈值

  • 通过函数cv2.threshold(),实现Otsu阈值处理
  • 函数原型retval, dst = cv2.threshold( src, thresh, maxval, type )
  • 参数说明
    • retval返回的阈值
    • dst阈值分割结果图像,与原始图像具有相同的大小和类型。
    • src要进行阈值分割的图像,必须是单通道的8位或32位浮点型数值。
    • thresh:设定的阈值对于Otsu算法,该值必须设置为0
    • maxval:设定的最大值一般可设定为255
    • type阈值分割的类型对于Otsu算法,该值必须设置为cv2.THRESH_OTSU
import cv2
src = cv2.imread("person.jpg", cv2.IMREAD_GRAYSCALE)
val, OTSU = cv2.threshold(src=src, thresh=0, maxval=255, type=cv2.THRESH_OTSU)
cv2.imwrite("OTSU.jpg", OTSU)
原图Otsu二值化
原图Otsu二值化

4. 自适应阈值处理#

​ 对于色彩均衡的图像,直接使用一个阈值就能完成对图像的阈值化处理。但是,有时图像的色彩是不均衡的,此时如果只使用一个阈值,就无法得到清晰有效的阈值分割结果图像

​ 有一种改进的阈值处理技术,它使用变化的阈值完成对图像的阈值处理,这种技术被称为自适应阈值处理。在进行阈值处理时,自适应阈值处理的方式通过计算每个像素点周围临近区域的加权平均值获得阈值,并使用该阈值对当前像素点进行处理。与普通的阈值处理方法相比,自适应阈值处理能够更好地处理明暗差异较大的图像

  • 通过函数cv2.adaptiveThreshold(),实现自适应阈值处理
  • 函数原型dst = cv.adaptiveThreshold( src, maxValue, adaptiveMethod, thresholdType, blockSize, C )
  • 参数说明
    • dst阈值分割结果图像,与原始图像具有相同的大小和类型。
    • src要进行阈值分割的图像,必须是单通道8位图像
    • maxValue:设定的最大值一般可设定为255
    • adaptiveMethod自适应方法
      • cv2.ADAPTIVE_THRESH_MEAN_C邻域所有像素点的权重值是一致的
      • cv2.ADAPTIVE_THRESH_GAUSSIAN_C权重值与邻域各个像素点到中心点的距离有关,通过高斯方程得到各个点的权重值。
    • thresholdType阈值分割的类型该值必须是cv2.THRESH_BINARY或cv2.THRESH_BINARY_INV其中的一个
    • blockSize邻域检测块的大小,通常设置为3、5、7等。
    • C:常量。
import cv2
src = cv2.imread("person.jpg", cv2.IMREAD_GRAYSCALE)
MEAN = cv2.adaptiveThreshold(src, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 3)
GAUSS = cv2.adaptiveThreshold(src, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 5, 3)
cv2.imwrite("MEAN.jpg", MEAN)
cv2.imwrite("GAUSS.jpg", GAUSS)
原图均值法高斯法
原图均值法高斯法
封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00