系列文章
Python+OpenCV图像处理(一)——OpenCV框架与图像插值算法
Python+OpenCV图像处理(二)——几何变换
Python+OpenCV图像处理(三)——彩色空间互换
Python+OpenCV图像处理(四)——图像滤波
Python+OpenCV图像处理(五)——图像阈值和二值化
Python+OpenCV图像处理(六)——边缘检测
五、图像阈值和二值化
5.1 简介
图像阈值化分割是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。图像阈值化的目的是要按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,各个区域内部具有一致的属性,而相邻区域不具有这种一致属性。
5.2 简单阈值
在这里,问题直截了当。对于每个像素,应用相同的阈值。如果像素值小于阈值,则将其设置为0,否则将其设置为最大值。函数cv.threshold用于应用阈值。第一个参数是源图像,它应该是灰度图像。第二个参数是阈值,用于对像素值进行分类。第三个参数是分配给超过阈值的像素值的最大值。OpenCV提供了不同类型的阈值,这由函数的第四个参数给出。通过使用cv.THRESH_BINARY类型。所有简单的阈值类型为
对于图像阈值化分割,最简单的方法是,如果像素值高于阈值(TH),将其设为最大值,如果像素值低于阈值,则将其设为最小值。举个例子,对于像素值为0~255的图像,大于TH,设为255。小于TH,设为0。这种简单的方法也被称作二值化。在OpenCV中可以使用cv2.THRESH_BINARY实现。常用的简单阈值分割的原理图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/1178f0a6413e8225b88c1e8ef84805f5.png)
- 二值阈值化 —— 像素值大于阈值的设为最大值,小于阈值的设为最小值
- 反向二值阈值化 —— 像素值大于阈值的设为最小值,小于阈值的设为最大值
- 截断阈值化 —— 像素值大于阈值的设为阈值,小于阈值的保持原来的像素值
- 超过阈值被置0 —— 像素值大于阈值的置为0,小于阈值的保持原来的像素值
- 低于阈值被置0 —— 像素值大于阈值的保持原来的像素值,小于阈值的置为0
这几种简单阈值的方法对应OpenCV中的函数为:
- cv2.THRESH_BINARY
- cv2.THRESH_BINARY_INV
- cv2.THRESH_TRUNC
- cv2.THRESH_TOZERO
- cv2.THRESH_TOZERO_INV
![](https://i-blog.csdnimg.cn/blog_migrate/ec0fdeee6e92d2b2eac2da41bd56e2c4.png)
这些函数都有两个返回值,第一个返回值为使用的阈值,第二个就是阀值化之后的图像了。
实现
#%%
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('lena.jpg',0)
ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
ret,thresh4 = cv2