opencv-python库 cv2图像二值化详解
图像二值化原理
图像二值化原理是通过设定一个阈值,将图像中的像素点的灰度值与阈值进行比较,大于阈值的像素点设置为白色,小于阈值的像素点设置为黑色
1。图像二值化是将彩色或灰度图像转换为只包含两种颜色(通常是黑色和白色)的二值图像的过程1。
图像二值化通常分为自适应二值化、定阈二值化、OTSU算法等。定阈二值化是用户把整幅图像上的每个像素点的灰度值设定为某一阈值,当灰度值大于该阈值时,其灰度值被视为"1",如果小于该阈值,其灰度值被视为"0",从而实现了图像二值化2。
cv2.threshold()
cv2.threshold 是 OpenCV(一个开源的计算机视觉库)中的一个函数,用于对图像进行阈值处理,也就是将图像转换为二值图像。这个函数特别适用于那些需要明确区分前景和背景的情况,例如,当你想要检测图像中的某个物体时。
函数原型
cv2.threshold(src, thresh, maxval, type[, dst])
参数说明
- src:输入图像,通常是一个灰度图像。阈值处理通常在灰度图像上进行,因为灰度图像只有一个通道,处理起来比较简单。
- thresh:阈值。这是一个用于分类像素值的参数。所有小于 thresh 的像素值都会被赋予一个新的值(通常是 0),而所有大于或等于 thresh 的像素值都会被赋予另一个值(通常是 maxval)。
- maxval:当像素值超过阈值时,所赋予的值。在二值化的情况下,这通常是 255(白色)。
- type:阈值类型,决定了如何处理像素值与阈值之间的关系。OpenCV 提供了多种阈值类型,如:
- cv2.THRESH_BINARY:二值化阈值化。所有大于 thresh 的像素值设为 maxval,小于等于 thresh 的像素值设为 0。
- cv2.THRESH_BINARY_INV:反二值化阈值化。所有大于 thresh 的像素值设为 0,小于等于 thresh 的像素值设为 maxval。
- cv2.THRESH_TRUNC:截断阈值化。所有大于 thresh 的像素值设为 thresh,小于等于 thresh 的像素值不变。
- cv2.THRESH_TOZERO:阈值化为 0。所有大于 thresh 的像素值不变,小于等于 thresh 的像素值设为 0。
- cv2.THRESH_TOZERO_INV:反阈值化为 0。所有大于 thresh 的像素值设为 0,小于等于 thresh 的像素值不变。
- dst:输出图像,是一个可选参数。如果提供了这个参数,函数会将结果存储在这个图像中,而不是创建一个新的图像。
使用示例
import cv2
# 读取图像并转换为灰度图像
image = cv2.imread('path_to_your_image.jpg', cv2.IMREAD_GRAYSCALE)
# 应用阈值处理
ret, thresholded_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
# 显示原始图像和阈值化后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Thresholded Image', thresholded_image)
# 等待按键并关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
在这个示例中,我们读取了一个图像,将其转换为灰度图像,然后应用了二值化阈值处理。ret 变量存储了使用的阈值,而 thresholded_image 是阈值处理后的图像。最后,我们显示了原始图像和阈值化后的图像。
Qtsu二值化
在OpenCV中,cv2.threshold 函数用于对图像进行阈值处理。当您使用 cv2.THRESH_BINARY 与 cv2.THRESH_OTSU 结合时(使用位运算符 | 来组合它们),这意味着您想使用大津算法(Otsu’s method)来自动计算一个最优阈值,并将图像二值化。
使用 | 符号来组合 cv2.THRESH_BINARY 和 cv2.THRESH_OTSU 意味着您希望同时应用这两种操作:二值化图像并使用Otsu’s 方法计算阈值。
下面是一个Python代码示例,展示了如何使用 cv2.threshold 函数和Otsu’s 方法:
import cv2
# 读取图像并转换为灰度图像
gray_img = cv2.imread('path_to_your_image.jpg', cv2.IMREAD_GRAYSCALE)
# 使用Otsu's 方法计算阈值并进行二值化
ret, thresh_img = cv2.threshold(gray_img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
# ret变量现在包含由Otsu's 方法计算出的最优阈值
# thresh_img是应用了这个阈值后的二值化图像
# 显示原始图像和二值化后的图像
cv2.imshow('Original Image', gray_img)
cv2.imshow('Thresholded Image', thresh_img)
# 等待按键并关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
在这个例子中,ret 变量将包含由Otsu’s 方法计算出的最优阈值,而 thresh_img 是应用了这个阈值后的二值化图像。这种方法在处理光照不均或具有不同对比度的图像时特别有用,因为它可以自动适应图像内容来确定最佳阈值。
cv2.adaptiveThreshold
cv2.adaptiveThreshold 是 OpenCV 中的一个图像处理函数,用于对灰度图像进行自适应阈值处理。与全局阈值处理不同,自适应阈值处理根据图像的局部区域来确定阈值,因此可以有效地处理光照不均匀的图像1。
以下是 cv2.adaptiveThreshold 的详细用法和参数说明:
函数原型
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
参数说明
- src:输入图像,应为灰度图像。
- maxValue:当像素值超过(或小于,取决于阈值类型)计算出的阈值时,所赋予的值。通常设置为 255,表示白色。
- adaptiveMethod:自适应方法,决定如何计算阈值。常用的有 cv2.ADAPTIVE_THRESH_MEAN_C(邻域内像素的平均值)和 cv2.ADAPTIVE_THRESH_GAUSSIAN_C(邻域内像素的高斯加权和)。
- thresholdType:阈值类型,决定如何应用阈值。常用的有 cv2.THRESH_BINARY(二值化)和 cv2.THRESH_BINARY_INV(反二值化)。
- blockSize:计算阈值时要考虑的邻域大小(像素数量)。这个值必须是奇数。
- C:从计算出的阈值中减去的常数。
使用示例
import cv2
# 读取图像并转换为灰度图像
gray_img = cv2.imread('path_to_your_image.jpg', cv2.IMREAD_GRAYSCALE)
# 使用自适应阈值处理
thresh_img = cv2.adaptiveThreshold(gray_img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
# 显示原始图像和处理后的图像
cv2.imshow('Original Image', gray_img)
cv2.imshow('Adaptive Threshold Image', thresh_img)
# 等待按键并关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
在这个示例中,blockSize 设置为 11(一个奇数),C 设置为 2。你可以根据图像的特点调整这些参数以获得最佳效果。
更多推荐
所有评论(0)