【OpenCV-Python】12.OpenCV的阈值处理

12.OpenCV的阈值处理



前言

  阈值处理用于剔除图像中像素值高于或低于指定值的像素点。


一、全局阈值处理

  全局阈值处理是指将大于阈值的像素值设置为255,将其他像素值设置为0;或者将大于阈值的像素设置为0,将其他像素值设置为255。
  OpenCV的cv2.threshold()函数用于实现全局阈值处理。

阈值类型说明
cv2.THRESH_BINARY将大于阈值的像素值设置为255,将其它像素设置为0
cv2.THRESH_BINARY_INV将大于阈值的像素值设置为0,将其它像素设置为255
cv2.THRESH_TRUNC将大于阈值的像素值设置为阈值,其它像素值不变
cv2.THRESH_TOZERO将大于阈值的像素值设置为0,其它像素值不变
cv2.THRESH_TOZERO_INV将小于阈值的像素值设置为0,其它像素值不变
retval, dst = cv2.threshold(src, thresh, maxval, type)

retval为返回的阈值
dst为全局阈值处理后的结果图像
src为原图像
thresh为设置的阈值
maxval是阈值类型为THRESH_BINARY和THRESH_BINARY_INV时使用的最大值
type为阈值类型

1、二值化阈值处理

  在OpenCV中的cv2.threshold()函数的type参数为cv2.THRESH_BINARY时执行二值化阈值处理,将大于阈值像素的值设置为255,将其他像素值设置为0。

# 阈值处理
img = cv2.imread('bee.jpg')
cv2.imshow('bee', img)

ret1, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

cv2.imshow('THRESH_BINARY', thresh1)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

2、反二值化阈值处理

  在OpenCV中的cv2.threshold()函数的type参数为cv2.THRESH_BINARY_INV时执行二值化阈值处理,将大于阈值像素的值设置为0,将其他像素值设置为255。

# 阈值处理
img = cv2.imread('bee.jpg')
cv2.imshow('bee', img)

ret1, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)

cv2.imshow('THRESH_BINARY_INV', thresh1)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

3、截断阈值处理

  在OpenCV中的cv2.threshold()函数的type参数为cv2.THRESH_TRUNC时执行二值化阈值处理,将大于阈值像素的值设置为阈值,其他像素值保持不变。

# 阈值处理
img = cv2.imread('bee.jpg')
cv2.imshow('bee', img)

ret1, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)

cv2.imshow('THRESH_TRUNC', thresh1)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

4、超阈值零处理

  在OpenCV中的cv2.threshold()函数的type参数为cv2.THRESH_TOZERO时执行二值化阈值处理,将大于阈值像素的值设置为0,其他像素值保持不变。

# 阈值处理
img = cv2.imread('bee.jpg')
cv2.imshow('bee', img)

ret1, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)

cv2.imshow('THRESH_TOZERO', thresh1)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

4、低阈值零处理

  在OpenCV中的cv2.threshold()函数的type参数为cv2.THRESH_TOZERO_INV时执行二值化阈值处理,将大于阈值像素的值设置为0,其他像素值保持不变。

# 阈值处理
img = cv2.imread('bee.jpg')
cv2.imshow('bee', img)

ret1, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)

cv2.imshow('THRESH_TOZERO_INV', thresh1)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

5、Otsu算法阈值处理

  对于色彩不均衡的图像,Otsu算法阈值处理效果更好,它会遍历当前图像中的所有阈值,再选这出最佳阈值。大津法(Otsu)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出。从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大。
  在OpenCV中的cv2.threshold()函数通过在type阈值参数后加上cv2.THRESH_OTSU来实现Otsu算法阈值处理。

# Otsu算法阈值处理
img = cv2.imread('bee.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('bee_gray', img)

ret1, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
ret2, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
ret3, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

cv2.imshow('THRESH_BINARY', thresh1)
cv2.imshow('THRESH_BINARY+OTSU', thresh2)
cv2.imshow('THRESH_BINARY_INV+OTSU', thresh3)

cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

6、三角算法阈值处理

  三角算法阈值处理最早见于Zack的论文《Automatic measurement of sister chromatid exchange frequency》主要是用于染色体的研究。该方法是使用直方图数据,基于纯几何方法来寻找最佳阈值,它的成立条件是假设直方图最大波峰在靠近最亮的一侧,然后通过三角形求得最大直线距离,根据最大直线距离对应的直方图灰度等级即为分割阈值。
  在OpenCV中的cv2.threshold()函数通过在type阈值参数后加上cv2.THRESH_TRIANGLE来实现三角算法阈值处理。

# 三角算法阈值处理
img = cv2.imread('bee.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('bee_gray', img)

ret1, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
ret2, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY + cv2.THRESH_TRIANGLE)
ret3, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_TRIANGLE)

cv2.imshow('THRESH_BINARY', thresh1)
cv2.imshow('THRESH_BINARY+TRIANGLE', thresh2)
cv2.imshow('THRESH_BINARY_INV+TRIANGLE', thresh3)

cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

二、自适应阈值处理(局部阈值处理)

  自适应阈值处理(局部阈值处理),它通过计算每个像素点领域的加权平均值来确定阈值,并用该阈值处理当前像素点。全局阈值处理适用于色彩均衡的图像,自适应阈值处理则适用于明暗差异较大的图像。
  OpenCV的cv2.adaptiveThreshold()函数用于实现自适应阈值处理。

dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)

dst为阈值处理的结果图像
src为原图像
maxValue为最大值
adaptiveMethod为自适应方法
thresholdType为阈值处理方式, 其值为cv2.THRESH_BINARY或cv2.THRESH_BINARY_INV
blockSize为计算局部阈值的领域大小
C为常量, 自适应阈值为blockSize指定邻域的加权平均值减去C
自适应方法说明
cv2.ADAPTIVE_THRESH_MEAN_C邻域中所有像素点的权值相同
cv2.ADAPTIVE_THRESH_GAUSSIAN_C邻域中像素点的权值与其到中心点的距离有关,可通过高斯方程计算各个点的权重值
# 自适应阈值处理
img = cv2.imread('bee.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('bee_gray', img)

# 滤波处理
img = cv2.medianBlur(img, 3)
cv2.imshow('bee_gray_medianBlur', img)

# 阈值处理
ret1, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
ret2, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY + cv2.THRESH_TRIANGLE)
ret3, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 平均值阈值
th4 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,10)
# 高斯阈值
th5 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,10)

cv2.imshow('THRESH_BINARY', thresh1)
cv2.imshow('THRESH_BINARY+TRIANGLE', thresh2)
cv2.imshow('THRESH_BINARY+OTSU', thresh3)
cv2.imshow('ADAPTIVE_THRESH_MEAN_C', th4)
cv2.imshow('ADAPTIVE_THRESH_GAUSSIAN_C', th5)

cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述


三、OpenCV-Python资源下载

OpenCV-Python测试用图片、中文官方文档、opencv-4.5.4源码


总结

  以上内容介绍了OpenCV-Python中几种基本阈值处理的操作,有关Python、数据科学、人工智能等文章后续会不定期发布,请大家多多关注,一键三连哟(●’◡’●)。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器视觉小学徒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值