opencv二值化(opencv二值化阈值)
## OpenCV二值化### 简介图像二值化是图像处理中一种常见的形态学操作,其主要目的是最大限度地减少图像中的灰度级,理想情况下将其减少到两种颜色(黑色和白色)。在OpenCV中,二值化操作常用于目标识别、图像分割、OCR等领域。### 二值化方法OpenCV提供了多种二值化方法,主要包括:#### 1. 全局阈值二值化-
原理:
对整幅图像使用同一个阈值进行二值化,像素值大于阈值的设为255(白色),小于阈值的设为0(黑色)。-
函数:
`cv2.threshold(src, thresh, maxval, type)`- `src`: 输入图像 (单通道, 8位或32位浮点型)- `thresh`: 阈值 - `maxval`: 填充值, 当像素值超过了阈值时,将像素值设置为该值。- `type`: 阈值化类型,常见的有:- `cv2.THRESH_BINARY`: 超过阈值设为maxval,否则设为0- `cv2.THRESH_BINARY_INV`: 超过阈值设为0,否则设为maxval- `cv2.THRESH_TRUNC`: 超过阈值设为阈值本身,否则保持原值- `cv2.THRESH_TOZERO`: 超过阈值保持原值,否则设为0- `cv2.THRESH_TOZERO_INV`: 超过阈值设为0,否则保持原值-
适用场景:
适用于图像前景和背景灰度值差异明显,且光照均匀的图像。
代码示例:
```pythonimport cv2img = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)cv2.imshow("Binary Threshold", thresh1)cv2.waitKey(0)cv2.destroyAllWindows()```#### 2. 自适应阈值二值化-
原理:
根据图像局部区域的像素值分布自适应地计算阈值,能够更好地处理光照不均匀的图像。-
函数:
`cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)`- `src`: 输入图像 (单通道, 8位)- `maxValue`: 填充值- `adaptiveMethod`: 自适应阈值算法,包括:- `cv2.ADAPTIVE_THRESH_MEAN_C`: 阈值取自邻域像素的平均值- `cv2.ADAPTIVE_THRESH_GAUSSIAN_C`: 阈值取自邻域像素的高斯加权和- `thresholdType`: 阈值化类型, 与`cv2.threshold`函数相同- `blockSize`: 邻域大小 (奇数)- `C`: 常数, 从平均值或加权平均值中减去-
适用场景:
适用于光照不均匀的图像。
代码示例:
```pythonimport cv2img = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)thresh2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)cv2.imshow("Adaptive Threshold", thresh2)cv2.waitKey(0)cv2.destroyAllWindows()```#### 3. Otsu二值化-
原理:
一种自动计算全局阈值的算法,通过统计图像直方图,找到最佳的分割阈值,使得前景和背景之间的类间方差最大。-
函数:
`cv2.threshold(src, thresh, maxval, type)`,其中`type`参数需要加上`cv2.THRESH_OTSU`-
适用场景:
适用于直方图明显 bimodal 分布的图像,能够自动找到最佳阈值。
代码示例:
```pythonimport cv2img = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)ret, thresh3 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)cv2.imshow("Otsu's Threshold", thresh3)cv2.waitKey(0)cv2.destroyAllWindows()```### 总结OpenCV 提供了多种二值化方法,选择合适的二值化方法取决于具体的应用场景和图像特征。
对于光照均匀且前景背景对比度高的图像,全局阈值二值化简单有效。
对于光照不均匀的图像,自适应阈值二值化能够更好地适应局部变化。
当需要自动确定最佳阈值时,可以选择 Otsu 二值化算法。 在实际应用中,可以根据需要组合使用不同的二值化方法,并结合其他图像处理技术,以达到最佳的二值化效果。
OpenCV二值化
简介图像二值化是图像处理中一种常见的形态学操作,其主要目的是最大限度地减少图像中的灰度级,理想情况下将其减少到两种颜色(黑色和白色)。在OpenCV中,二值化操作常用于目标识别、图像分割、OCR等领域。
二值化方法OpenCV提供了多种二值化方法,主要包括:
1. 全局阈值二值化- **原理:** 对整幅图像使用同一个阈值进行二值化,像素值大于阈值的设为255(白色),小于阈值的设为0(黑色)。- **函数:** `cv2.threshold(src, thresh, maxval, type)`- `src`: 输入图像 (单通道, 8位或32位浮点型)- `thresh`: 阈值 - `maxval`: 填充值, 当像素值超过了阈值时,将像素值设置为该值。- `type`: 阈值化类型,常见的有:- `cv2.THRESH_BINARY`: 超过阈值设为maxval,否则设为0- `cv2.THRESH_BINARY_INV`: 超过阈值设为0,否则设为maxval- `cv2.THRESH_TRUNC`: 超过阈值设为阈值本身,否则保持原值- `cv2.THRESH_TOZERO`: 超过阈值保持原值,否则设为0- `cv2.THRESH_TOZERO_INV`: 超过阈值设为0,否则保持原值- **适用场景:** 适用于图像前景和背景灰度值差异明显,且光照均匀的图像。**代码示例:**```pythonimport cv2img = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)cv2.imshow("Binary Threshold", thresh1)cv2.waitKey(0)cv2.destroyAllWindows()```
2. 自适应阈值二值化- **原理:** 根据图像局部区域的像素值分布自适应地计算阈值,能够更好地处理光照不均匀的图像。- **函数:** `cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)`- `src`: 输入图像 (单通道, 8位)- `maxValue`: 填充值- `adaptiveMethod`: 自适应阈值算法,包括:- `cv2.ADAPTIVE_THRESH_MEAN_C`: 阈值取自邻域像素的平均值- `cv2.ADAPTIVE_THRESH_GAUSSIAN_C`: 阈值取自邻域像素的高斯加权和- `thresholdType`: 阈值化类型, 与`cv2.threshold`函数相同- `blockSize`: 邻域大小 (奇数)- `C`: 常数, 从平均值或加权平均值中减去- **适用场景:** 适用于光照不均匀的图像。**代码示例:**```pythonimport cv2img = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)thresh2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)cv2.imshow("Adaptive Threshold", thresh2)cv2.waitKey(0)cv2.destroyAllWindows()```
3. Otsu二值化- **原理:** 一种自动计算全局阈值的算法,通过统计图像直方图,找到最佳的分割阈值,使得前景和背景之间的类间方差最大。- **函数:** `cv2.threshold(src, thresh, maxval, type)`,其中`type`参数需要加上`cv2.THRESH_OTSU`- **适用场景:** 适用于直方图明显 bimodal 分布的图像,能够自动找到最佳阈值。**代码示例:**```pythonimport cv2img = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)ret, thresh3 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)cv2.imshow("Otsu's Threshold", thresh3)cv2.waitKey(0)cv2.destroyAllWindows()```
总结OpenCV 提供了多种二值化方法,选择合适的二值化方法取决于具体的应用场景和图像特征。 * 对于光照均匀且前景背景对比度高的图像,全局阈值二值化简单有效。 * 对于光照不均匀的图像,自适应阈值二值化能够更好地适应局部变化。 * 当需要自动确定最佳阈值时,可以选择 Otsu 二值化算法。 在实际应用中,可以根据需要组合使用不同的二值化方法,并结合其他图像处理技术,以达到最佳的二值化效果。