Python OpenCV 简单阈值算法实现与对比
本文详细解析 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 图像处理技术的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









