《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}
⎣⎢⎢⎢⎢⎡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 是阈值处理后的结果图像