6.2 阈值处理-- 自适应阈值处理和 阈值Otsu处理

《OpenCV 轻松入门 面向Python》 学习笔记

阈值处理

      • 自适应阈值处理
      • 阈值 Otsu 处理
      • 自适应阈值处理 与 OTSU阈值处理 的差异:

自适应阈值处理

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

所以这一节我们介绍自适应阈值处理(阈值是变化的)。在阈值处理时,自适应阈值处理方式通过计算每个像素点周围临近区域的加权平均值获得阈值,并使用阈值对当前像素进行处理。与普通阈值处理方法相比,自适应阈值处理能够更好地处理明暗差异较大的图像。

函数原型:

dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethold, thresholdType, blickSize, C)

参数:

  • dst:自适应阈值处理后的结果图像
  • src:原始图像
  • maxValue:最大值
  • adaptiveMethold:自适应方法
  • thresholdType:阈值处理方式,该值只能是cv.THRESH_BINARY,或者cv.THRESH_BINARY_INV
  • blockSize:计算像素阈值时,在像素周围的取的临近区域大小,通常取值为3, 5, 7
  • C:常量,自适应阈值等于每个像素由参数blocksize所指定邻域的加权平均值减去常量C

自适应阈值处理方法 adaptiveMethold 有两种:

  • cv2.ADAPTIVE_THRESH_MEAN_C:邻域所有像素点的权重是一致的
  • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:与邻域各个像素点到中心点的距离有关,通过高斯方程得到各个像素点的权重值

举例:

dst = cv2.adaptiveThreshold(src_img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 3)

阈值 Otsu 处理

在使用函数cv.threshold()进行阈值处理时,需要自定义一个阈值,并以此阈值作为图像阈值处理的依据。通常情况下图像都是色彩均衡的,这是直接将阈值设为127是比较合适的。

但是,有时图像灰度级的分布是不均匀的,如果此时还将阈值设值为127,那么阈值处理的结果就是失败的。

如果有一个图像:
[ 123 123 123 123 123 123 123 123 123 123 123 123 126 126 126 123 123 126 126 126 123 123 126 126 126 ] \begin{bmatrix} 123 & 123 & 123 & 123 & 123\\ 123 & 123 & 123 & 123 & 123\\ 123 & 123 & 126 & 126 & 126\\ 123 & 123 & 126 & 126 & 126\\ 123 & 123 & 126 & 126 & 126\\ \end{bmatrix} 123123123123123123123123123123123123126126126123123126126126123123126126126

如果此时仍然以127作为阈值,那么图像处理结果就是
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ] \begin{bmatrix} 0 & 0 & 0 & 0& 0\\ 0 & 0 & 0 & 0& 0\\ 0 & 0 & 0 & 0& 0\\ 0 & 0 & 0 & 0& 0\\ 0 & 0 & 0 & 0& 0\\ \end{bmatrix} 0000000000000000000000000
很显然,真是不合理的,我们可以观察到,如果我们以阈值125进行分割,可以得到较好的效果
[ 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 255 255 255 0 0 255 255 255 ] \begin{bmatrix} 0 & 0 & 0 & 0& 0\\ 0 & 0 & 0 & 0& 0\\ 0 & 0 & 255 & 255& 255\\ 0 & 0 & 255 & 255& 255\\ 0 & 0 & 255 & 255& 255\\ \end{bmatrix} 0000000000002552552550025525525500255255255
OTSU可以帮我们遍历所有可能的阈值,从而找到最佳的阈值

举例:

t, result_img = cv2.threshold(src_image, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

具体操作方法是:

  • 在普通阈值操作函数cv2.threshold()中,对参数type的类型多传递一个参数cv2.THRESH_OTSU,即可实现Otsu方式的阈值分割
  • 必须要把阈值设定为0
  • 返回的t是Otsu方法计算得到并使用的最优阈值, 返回值 result_img 是阈值处理后的结果图像

自适应阈值处理 与 OTSU阈值处理 的差异:

  • 自适应阈值处理是按照blocksize的尺寸,逐个像素找阈值,也就是说,处理每个像素所用的阈值是不一样的。这也就是为啥返回值没有 threshold。

  • OTSU阈值处理,会给图像找一个统一使用的阈值,所有的像素都是按照这个阈值处理的。返回值有两个,第一个返回值就是threshold。

你可能感兴趣的:(OpenCV,opencv,计算机视觉,深度学习,机器学习)