简单阈值
cv.threshold 函数是 OpenCV 中用于应用阈值处理的函数,具体的语法如下:
ret, dst = cv2.threshold(src, thresh, maxval, type[, dst])
参数说明:
- src:源图像,应为灰度图像(单通道)。
- thresh:阈值,用于对像素值进行分类。
- maxval:分配给超过阈值的像素值的最大值。
- type:阈值处理类型,用于控制像素分类的方式,可以使用以下常见的简单阈值类型:
- cv2.THRESH_BINARY:二值化阈值处理,将小于阈值的像素值设置为0,大于等于阈值的像素值设置为 maxval。
- cv2.THRESH_BINARY_INV:反二值化阈值处理,将小于阈值的像素值设置为 maxval,大于等于阈值的像素值设置为0。
- cv2.THRESH_TRUNC:截断阈值处理,将小于阈值的像素值保持不变,大于等于阈值的像素值设置为阈值。
- cv2.THRESH_TOZERO:阈值化为零处理,将小于阈值的像素值设置为0,大于等于阈值的像素值保持不变。
- cv2.THRESH_TOZERO_INV:反阈值化为零处理,将小于阈值的像素值保持不变,大于等于阈值的像素值设置为0。
-
dst:输出的目标图像(可选参数),与源图像具有相同的尺寸和数据类型。
函数返回两个值: -
ret:计算的阈值值。
-
dst:处理后的图像。
自适应阈值
自适应阈值化是一种基于局部像素区域确定阈值的阈值处理方法,可以解决图像在不同区域具有不同光照条件的情况下的阈值处理问题,算法基于像素周围的小区域确定像素的阈值。
OpenCV 中提供了 cv2.adaptiveThreshold 函数来实现自适应阈值化。
cv.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst])
- src:输入图像,必须为单通道(灰度图像)。
- maxValue:所得阈值的最大值。
- adaptiveMethod:自适应阈值计算方法,可以选择以下两种方法之一:
- cv.ADAPTIVE_THRESH_MEAN_C:阈值为邻域像素的平均值减去常数 C。
- cv.ADAPTIVE_THRESH_GAUSSIAN_C:阈值为邻域像素的高斯加权平均值减去常数 C。
- thresholdType:阈值类型,可以选择以下两种类型之一:
- cv.THRESH_BINARY:大于阈值的像素值设为 maxValue,小于等于阈值的像素值设为 0。
- cv.THRESH_BINARY_INV:大于阈值的像素值设为 0,小于等于阈值的像素值设为 maxValue。
- blockSize:邻域大小,用于计算每个像素的阈值。
- C:从邻域像素的平均值或加权总和中减去的一个常数。
- dst:输出图像,与输入图像具有相同的大小和深度。如果未提供,则函数会创建一个新的图像来存储结果。
import numpy as np
import cv2 as cv
# 读取图像
img = cv.imread('pic1.jpg', 0)
# 获取图像尺寸
rows, cols = img.shape
max_value = 255
adaptive_method = cv.ADAPTIVE_THRESH_MEAN_C
threshold_type = cv.THRESH_BINARY
block_size = 11
constant = 2
threshold_img = cv.adaptiveThreshold(img, max_value, adaptive_method, threshold_type, block_size, constant)
# 显示结果
cv.imwrite('pic.jpg', threshold_img)
cv.waitKey(0)
cv.destroyAllWindows()
Otsu二值化
Otsu的二值化(Otsu’s thresholding)是一种自动确定全局阈值的图像二值化方法。它通过分析图像的直方图,找到一个最佳的阈值,以将图像分为前景和背景两部分。
cv2.threshold函数进行Otsu的二值化处理。在函数中,将阈值设为0(该值不会影响Otsu的计算),将阈值类型设置为cv2.THRESH_BINARY + cv2.THRESH_OTSU。函数会自动计算出最佳的阈值,并将结果保存在threshold_img变量中。
_, threshold_img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)