OpenCV轻松入门_面向python(第六章 阈值处理)

阈值处理:剔除图像的像素值高于或低于一定值的像素点。

threshold函数

语法格式:
retval, dst = cv2.threshold( src, thresh, maxval, type )

  • retval 代表返回的阈值。
  • dst 代表阈值分割结果图像,与原始图像具有相同的大小和类型。
  • src 代表要进行阈值分割的图像,可以是多通道的,8 位或 32 位浮点型数值。
  • thresh 代表要设定的阈值
  • maxval 代表当 type 参数为 THRESH_BINARY 或者 THRESH_BINARY_INV 类型时,需要设定的最大值
  • type 代表阈值分割的类型

阈值分割类型

阈值分割类型可视化

二值化阈值处理(cv2.THRESH_BINARY)

二值化阈值处理会将原始图像处理为仅有两个值的二值图像;对于灰度值大于 阈值thresh的像素点,将其灰度值设定为最大值;对于灰度值小于或等于阈值thresh的像素点,将其灰度值设定为 0。

用函数 cv2.threshold()对数组进行二值化阈值处理

python 复制代码
import cv2  
import numpy as np  
img = np.random.randint(0,256,size = [4,5],dtype=np.uint8)  
t,rst = cv2.threshold(img,127,255,cv2.THRESH_BINARY)  
print("img=\n",img)  
print("t=\n",t)  
print("rst=\n",rst)

使用函数 cv2.threshold()对图像进行二值化阈值处理

python 复制代码
import cv2  
import numpy as np  
img = cv2.imread("lena.jpg")  
t,rst = cv2.threshold(img,127,255,cv2.THRESH_BINARY)  
cv2.imshow("img",img)  
cv2.imshow("rst",rst)  
cv2.waitKey()  
cv2.destroyAllWindows()

r)

反二值化阈值处理(cv2.THRESH_BINARY_INV)

对于灰度值大于阈值的像素点,将其值设定为 0;对于灰度值小于或等于阈值的像素点,将其值设定为 255。

用函数 cv2.threshold()对图像进行反二值化阈值处理

python 复制代码
import cv2  
import numpy as np  
img = cv2.imread("lena.jpg")  
t,rst = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)  
cv2.imshow("img",img)  
cv2.imshow("rst",rst)  
cv2.waitKey()  
cv2.destroyAllWindows()

截断阈值化处理(cv2.THRESH_TRUNC)

截断阈值化处理会将图像中大于阈值的像素点的值设定为阈值,小于或等于该阈值的像素点的值保持不变。

用函数 cv2.threshold()对图像进行截断阈值化处理。

python 复制代码
import cv2  
import numpy as np  
img=cv2.imread("lena.jpg")  
t,rst = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)  
cv2.imshow("img",img)  
cv2.imshow("rst",rst)  
cv2.waitKey()  
cv2.destroyAllWindows()

超阈值零处理(cv2.THRESH_TOZERO_INV)

超阈值零处理会将图像中大于阈值的像素点的值处理为 0,小于或等于该阈值的像素点的值保持不变。

python 复制代码
import cv2  
import numpy as np  
img=cv2.imread("lena.jpg")  
t,rst = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)  
cv2.imshow("img",img)  
cv2.imshow("rst",rst)  
cv2.waitKey()  
cv2.destroyAllWindows()

低阈值零处理(cv2.THRESH_TOZERO)

对于像素值大于阈值的像素点,其值将保持不变; 对于像素值小于或等于阈值的像素点,其值将被处理为 0。

用函数 cv2.threshold()对图像进行低阈值零处理。

python 复制代码
import cv2
img = cv2.imread("lena.jpg")
t,rst = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey()
cv2.destroyAllWindows()

自适应阈值处理

在进行阈值处理时,自适应阈值处理的方式通过计算每个像素点周围临近区域的加权平均值获得阈值,并使用该阈值对当前像素点进行处理。与普通的阈值处理方法相比,自适应阈值处理能够更好地处理明暗差异较大的图像。

函数 cv2.adaptiveThreshold()来实现自适应阈值处理,该函数的语法格式为:
dst=cv.adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,C)

  • dst 代表自适应阈值处理结果。
  • src 代表要进行处理的原始图像。需要注意的是,该图像必须是 8 位单通道的图像。
  • maxValue 代表最大值。
  • adaptiveMethod 代表自适应方法:
    cv2.ADAPTIVE_THRESH_MEAN_C :邻域所有像素点的权重值是一致的。
    cv2.ADAPTIVE_THRESH_GAUSSIAN_C:与邻域各个像素点到中心点的距离有关,通过高斯方程得到各个点的权重值。
  • thresholdType 代表阈值处理方式,该值必须是 cv2.THRESH_BINARYcv2.THRESH_BINARY_INV 中的一个。
  • blockSize 代表块大小。表示一个像素在计算其阈值时所使用的邻域尺寸,通常为 3、5、7 等。
  • C 是常量。
python 复制代码
import cv2  
img = cv2.imread("computer.jpg",0)  
t1,thd = cv2.threshold(img,127,255,cv2.THRESH_BINARY)  
athdMEAN=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,3)  
athdGAUS=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,3)  
cv2.imshow("img",img)  
cv2.imshow("thd",thd)  
cv2.imshow("athdMEAN",athdMEAN)  
cv2.imshow("athdGAUS",athdGAUS)  
cv2.waitKey()  
cv2.destroyAllWindows()

Otsu处理

Otsu 方法能够根据当前图像给出最佳的类间分割阈值

即:遍历 所有可能的阈值,找出最佳的阈值。

在函数 cv2.threshold()中对参数 type 的类型多传递一个参数cv2.THRESH_OTSU,可实现Otsu的阈值分割;使用 Otsu 方法时,要把阈值设为 0。此时的函数 cv2.threshold()会自动寻找最优阈值,并将该阈值返回。
t,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

测试 Otsu 阈值处理的实现。

python 复制代码
import cv2  
import numpy as np  
img = np.zeros((5,5),dtype=np.uint8)  
img[0:6,0:6]=123  
img[2:6,2:6]=126  
print("img=\n",img)  
t1,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY)  
print("thd=\n",thd)  
t2,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)  
print("otsu=\n",otsu)

别对一幅图像进行普通的二值化阈值处理和 Otsu 阈值处理,观察处理结果的差异。

python 复制代码
import cv2  
img = cv2.imread("tiffany.bmp",0)  
t1,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY)  
t2,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)  
cv2.imshow("thd",thd)  
cv2.imshow("otsu",otsu)  
cv2.waitKey()  
cv2.destroyAllWindows()
相关推荐
Nova_AI几秒前
014、AI开源生态:模型、工具与社区的盈利之道
人工智能·开源
weixin_513449963 分钟前
walk_these_ways项目学习记录第八篇(通过行为多样性 (MoB) 实现地形泛化)--策略网络
开发语言·人工智能·python·学习
飞Link8 分钟前
逆向兼容的桥梁:3to2 自动化降级工具实现全解析
运维·开发语言·python·自动化
管二狗赶快去工作!10 分钟前
体系结构论文(九十八):NPUEval: Optimizing NPU Kernels with LLMs and Open Source Compilers
人工智能·深度学习·自然语言处理·体系结构
zhangshuang-peta14 分钟前
通过 MCP 控制平面引入技能
人工智能·机器学习·ai agent·mcp·peta
曾阿伦16 分钟前
Python3 文件 (夹) 操作备忘录
开发语言·python
LX5677717 分钟前
传统编辑如何考取AI内容编辑师认证?学习路径详解
人工智能·学习
LaughingZhu19 分钟前
Product Hunt 每日热榜 | 2026-04-10
人工智能·经验分享·深度学习·神经网络·产品运营
数据知道20 分钟前
claw-code 源码分析:OmX `$team` / `$ralph`——把 AI 辅助开发从偶发灵感变成可重复流水线
数据库·人工智能·mysql·ai·claude code·claw code
manduic32 分钟前
告别传统编码器痛点!麦歌恩MT6701,重构位置检测选型新逻辑
人工智能·重构·磁性角度传感器