在图像处理中,阈值处理是一种常用的技术,用于将图像转换为二值图像(即黑白图像)。通过设定一个阈值,可以将图像中的像素分为两类:高于阈值的像素和低于阈值的像素。
OpenCV 提供了多种阈值处理方法,本文将详细介绍三种常见的阈值处理技术:简单阈值处理、自适应阈值处理以及
Otsu's 二值化。
1. 简单阈值处理 (cv2.threshold())
简单阈值处理是最基础的阈值处理方法。它通过设定一个固定的阈值,将图像中的像素分为两类。
OpenCV 提供了 cv2.threshold() 函数来实现这一功能。
函数原型 retval, dst = cv2.threshold(src, thresh, maxval, type) |
参数说明
- src: 输入图像,通常为灰度图像。
- thresh: 设定的阈值。
- maxval: 当像素值超过(或小于,根据类型)阈值时,赋予的新值。
- type: 阈值处理的类型,常见的类型有:
- cv2.THRESH_BINARY: 如果像素值大于阈值,则赋予 maxval,否则赋予 0。
- cv2.THRESH_BINARY_INV: 与 cv2.THRESH_BINARY 相反,如果像素值大于阈值,则赋予
0,否则赋予 maxval。
- cv2.THRESH_TRUNC: 如果像素值大于阈值,则赋予阈值,否则保持不变。
- cv2.THRESH_TOZERO: 如果像素值大于阈值,则保持不变,否则赋予 0。
- cv2.THRESH_TOZERO_INV: 与 cv2.THRESH_TOZERO 相反,如果像素值大于阈值,则赋予
0,否则保持不变。
返回值
- retval: 实际使用的阈值(在某些情况下可能与设定的阈值不同)。
- dst: 处理后的图像。
实例
实例
import cv2
import numpy as np
# 读取图像
img = cv2.imread('image.jpg', 0)
# 简单阈值处理
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 显示结果
cv2.imshow('Binary Threshold', thresh1)
cv2.waitKey(0)
cv2.destroyAllWindows()
|
2. 自适应阈值处理 (cv2.adaptiveThreshold())
在某些情况下,图像的亮度分布不均匀,使用固定的阈值可能无法得到理想的效果。自适应阈值处理通过为图像的不同区域计算不同的阈值,从而更好地处理这种情况。
函数原型 dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C) |
参数说明
- src: 输入图像,通常为灰度图像。
- maxValue: 当像素值超过(或小于,根据类型)阈值时,赋予的新值。
- adaptiveMethod: 自适应阈值计算方法,常见的类型有:
- cv2.ADAPTIVE_THRESH_MEAN_C: 阈值是邻域的平均值减去常数 C。
- cv2.ADAPTIVE_THRESH_GAUSSIAN_C: 阈值是邻域的加权平均值减去常数
C,权重由高斯函数确定。
- thresholdType: 阈值处理的类型,通常为 cv2.THRESH_BINARY 或
cv2.THRESH_BINARY_INV。
- blockSize: 计算阈值时使用的邻域大小,必须为奇数。
- C: 从平均值或加权平均值中减去的常数。
返回值
dst: 处理后的图像。
实例
实例
import cv2
import numpy as np
# 读取图像
img = cv2.imread('image.jpg', 0)
# 自适应阈值处理
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's 二值化 (cv2.threshold() with cv2.THRESH_OTSU)
Otsu's 二值化是一种自动确定阈值的方法。它通过最大化类间方差来找到最佳的全局阈值,适用于双峰图像(即图像直方图有两个明显的峰值)。
函数原型
retval, dst = cv2.threshold(src, thresh, maxval, type) |
参数说明
- src: 输入图像,通常为灰度图像。
- thresh: 由于 Otsu's 方法会自动确定阈值,因此该参数通常设置为 0。
- maxval: 当像素值超过(或小于,根据类型)阈值时,赋予的新值。
- type: 阈值处理的类型,通常为 cv2.THRESH_BINARY 或 cv2.THRESH_BINARY_INV,并加上
cv2.THRESH_OTSU。
返回值
- retval: 自动确定的阈值。
- dst: 处理后的图像。
retval, dst = cv2.threshold(src, thresh, maxval, type)
|
实例
实例
import
cv2
import
numpy as
np
# 读取图像
img =
cv2.imread('image.jpg',
0)
# Otsu's
二值化
ret,
thresh3 =
cv2.threshold(img,
0,
255,
cv2.THRESH_BINARY
+ cv2.THRESH_OTSU)
# 显示结果
cv2.imshow('Otsu\'s
Threshold',
thresh3)
cv2.waitKey(0)
cv2.destroyAllWindows()
|
|