python|6.3 阈值处理-- Otsu 处理

《OpenCV 轻松入门 面向Python》 学习笔记
在使用函数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} ???????123123123123123?123123123123123?123123126126126?123123126126126?123123126126126????????
如果此时仍然以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} ???????00000?00000?00000?00000?00000????????
很显然,真是不合理的,我们可以观察到,如果我们以阈值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} ???????00000?00000?00255255255?00255255255?00255255255????????
OTSU可以帮我们遍历所有可能的阈值,从而找到最佳的阈值
举例:

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

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

    推荐阅读