Python OpenCV 简单阈值算法实现与对比

听雨眠
听雨眠
发布时间:2026-10-12| 3人浏览过
原创

本文详细解析 OpenCV 中简单阈值函数的实现原理与参数配置。通过 Python 代码演示如何读取图像、转换为灰度,并对比 THRESH_BINARY、THRESH_BINARY_INV、THRESH_TRUNC 等五种不同阈值算法的处理效果,帮助开发者理解像素值重映射机制。

OpenCV 简单阈值算法实现

在图像处理中,阈值处理(Thresholding)是最基础的图像分割技术之一。OpenCV 提供了 cv2.threshold() 函数来实现这一功能。该函数的核心逻辑是将图像中的像素值与设定的阈值进行比较,并根据指定的算法重新分配像素值。

基础代码实现

首先,我们需要读取图像并将其转换为灰度图。OpenCV 默认以 BGR 格式读取彩色图像,因此必须通过 cv2.cvtColor() 进行颜色空间转换,或者直接在读取时指定标志位为灰度模式。

#! usr/bin/env python
# coding: utf-8
import cv2

img = cv2.imread('cat.jpg')
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 先将图像矩阵进行二值化
# img = cv2.imread('cat.jpg',0)
# 也可以直接将图像用灰度值读入,其中0就表示用灰度读图

cv2.imshow('img',img)

_,img1 = cv2.threshold(img,100,250,cv2.THRESH_BINARY)
# 这个函数返回两个值,第二个值才是二值化后的图像矩阵
# 最后一个参数表示一种二值化算法
# 阈值设置为100,
# 250表示大于100的像素值会被重新赋值为250

cv2.imshow('img',img1)

# cv2.waitKey()
cv2.destroyAllWindows()

在 cv2.threshold() 函数中,返回值包含两个部分:第一个是计算出的实际阈值(当使用固定阈值时通常等于输入阈值),第二个是经过处理后的图像矩阵。以 cv2.THRESH_BINARY 为例,当像素值大于阈值(如 100)时,将其设置为最大值(如 250);否则设置为 0。

不同阈值算法对比

OpenCV 提供了多种简单阈值算法,适用于不同的图像处理场景。以下代码演示了五种常见算法的效果对比:

############ 以下比较不同简单二值化算法的区别

# 先进行不同算法的二值化
ret,img1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
# 从名字可以看出一点来,binary是二元的意思,这里指要么0,要么指定的一个值(255)
print(ret)
ret,img2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
# 注意到INV表示逆,全写是inverse
ret,img3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
# 注意到truncate表示截断的意思。这个函数不再是二元,而是对超过某个值的部分进行处理,否则并不会处理。
ret,img4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
# 实际上,这也是一种阶段,对大于某一个值的像素值进行调整,与trunc不同的是,这里变为0,而不是最大值
ret,img5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)

import numpy as np
import matplotlib.pyplot as plt
#用这个模块来画图显示,这个库和opencv有些不同,可参考前面的博客
# https://blog.csdn.net/qq_27261889/article/details/80543966

# 先定义以下图的图题和图像矩阵
titles = ['original','binary','binary_inv','trunc','tozero','tozero_inv']
imgs = [img,img1,img2,img3,img4,img5]

for i in range(6):
  plt.subplot(2,3,i+1)#分别画出每一个图
  plt.imshow(imgs[i],'gray')
  plt.title(titles[i])#写出图题

plt.show()

算法详解

  • THRESH_BINARY:二元阈值处理。像素值大于阈值时设为最大值(如 255),否则设为 0。
  • THRESH_BINARY_INV:反向二元阈值处理。像素值大于阈值时设为 0,否则设为最大值。
  • THRESH_TRUNC:截断阈值处理。像素值大于阈值时设为阈值,否则保持不变。
  • THRESH_TOZERO:阈值化为零。像素值大于阈值时保持不变,否则设为 0。
  • THRESH_TOZERO_INV:反向阈值化为零。像素值大于阈值时设为 0,否则保持不变。

通过 matplotlib 库,我们可以直观地对比这五种算法对同一张灰度图像的处理结果。代码中使用了 plt.subplot() 将六张图像(原图及五种处理结果)排列在 2x3 的网格中,并分别标注标题以便观察差异。

以上就是 Python OpenCV 简单阈值算法实现与对比的详细内容,更多关于 OpenCV 图像处理技术的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。