Python OpenCV灰度切割与阈值处理详解
本文详细解析Python中OpenCV库的灰度切割技术,涵盖将特定灰度范围映射为二值或保持原值的两种核心方法。同时深入讲解cv2.threshold函数的语法、参数含义及五种阈值处理类型(二值化、反二值化等)的代码实现与效果分析。
1. 介绍
灰度切割旨在增强图像中特定亮度范围的对比度,通过突出显示特定的灰度级分层来优化视觉效果。
实现灰度切割主要基于两种基本方法,其他复杂形式均为这两种方法的变体。
- 第一种方法是将感兴趣范围内的所有灰度值统一映射为一个固定值(例如白色),而将范围外的灰度值映射为另一个值(例如黑色),从而生成一张二值图像。
- 第二种方法则是将感兴趣范围内的灰度值进行变亮处理,同时保持范围外的灰度值不变。
上述操作的数学映射函数如下所示:

灰度切割的一种特殊应用场景是阈值处理。
该方法用于将目标物体从背景中分离,也称为二值化处理,它是第一种灰度切割方法的典型变体。
2. 灰度切割代码实现
本示例未采用传统的for循环逐像素遍历方式,而是利用NumPy的向量化操作提高效率。
表达式x[:,:] > a用于定位x矩阵中所有行和列大于阈值a的元素位置,返回布尔数组。结合两个阈值条件,可精准定位介于阈值之间的像素点,并将其替换为255。
import cv2
import numpy as np
def transform1(x):
a , b = 150 , 240 # 定义两个阈值,中间部分变换为255
dst = x.copy()
dst[(x[:,:] >= a) & (x[:,:] <= b)] = 255 # 中间变换为255
dst[(x[:,:] < a) | (x[:,:] > b)] = 0 # 其余的变换为0
return dst
def transform2(x):
a , b = 150 , 240 # 定义两个阈值,中间部分变换为255
dst = x.copy()
dst[(x[:,:] >= a) & (x[:,:] <= b)] = 255 # 中间变换255,其余的不变
return dst
gray = cv2.imread('./img.png',0)
dst1 = transform1(gray)
dst2 = transform2(gray)
cv2.imshow('img',np.hstack((gray,dst1,dst2)))
cv2.waitKey()
cv2.destroyAllWindows()处理后的图像输出结果如下所示:

3. 阈值处理
如前所述,灰度切割的特殊应用即为阈值处理。OpenCV提供了cv2.threshold函数专门用于执行此类操作。
该函数的标准调用语法为:retval,dst = cv2.threshold(src , thresh , maxval , type)。
retval(返回值):表示处理过程中实际使用的阈值大小。
dst:表示经过阈值处理后的目标图像。
src:表示输入的处理前原始图像。
maxval(最大阈值):在生成二值图像时,若像素值超过thresh,则输出maxval;否则输出0。通常maxval设置为255。例如,小于150的像素输出0,其余像素输出maxval。
type:指定阈值处理的具体类型,OpenCV支持以下几种类型:
| type | 含义 |
| cv2.THRESH_BINARY | 二值化阈值处理:超出thresh,为255;否则为0 |
| cv2.THRESH_BINARY_INV | 反二值化阈值处理:超出thresh,为0;否则为255 |
| cv2.THRESH_TOZERO | 低于阈值零处理:低于thresh,为0;否则灰度值不变 |
| cv2.THRESH_TOZERO_INV | 超出阈值零处理:低于thresh,为255;否则为0 |
| cv2.THRESH_TRUNC(truncate截断) | 截断阈值处理:超过thresh,为thresh;否则不变 |
相关实现代码如下:
import cv2
import numpy as np
a = np.arange(0,256).reshape(1,-1).astype(np.uint8) # 0-255
img = cv2.resize(a,(800,100),interpolation=cv2.INTER_AREA) # 创建渐变图像
ret1,img1 = cv2.threshold(img,200,255,cv2.THRESH_BINARY) # 二值化阈值处理
ret2,img2 = cv2.threshold(img,200,255,cv2.THRESH_BINARY_INV) # 反二值化阈值处理
ret3,img3 = cv2.threshold(img,200,255,cv2.THRESH_TOZERO) # 低于阈值零处理
ret4,img4 = cv2.threshold(img,200,255,cv2.THRESH_TOZERO_INV) # 超出阈值零处理
ret5,img5 = cv2.threshold(img,200,255,cv2.THRESH_TRUNC) # 截断阈值处理
cv2.imshow('img',np.vstack((img,img1,img2,img3,img4,img5)))
cv2.waitKey()
cv2.destroyAllWindows()代码执行后的处理结果展示如下:

本文关于Python灰度变换中灰度切割与阈值处理的分析到此结束,更多相关技术内容请参阅本站其他文章或继续关注后续更新,感谢支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













