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

12.OpenCV的阈值处理


文章目录

  • 前言
  • 一、全局阈值处理
    • 1、二值化阈值处理
    • 2、反二值化阈值处理
    • 3、截断阈值处理
    • 4、超阈值零处理
    • 4、低阈值零处理
    • 5、Otsu算法阈值处理
    • 6、三角算法阈值处理
  • 二、自适应阈值处理(局部阈值处理)
  • 三、OpenCV-Python资源下载
  • 总结


前言

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


一、全局阈值处理

  全局阈值处理是指将大于阈值的像素值设置为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()

【OpenCV-Python】12.OpenCV的阈值处理_第1张图片

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()

【OpenCV-Python】12.OpenCV的阈值处理_第2张图片

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()

【OpenCV-Python】12.OpenCV的阈值处理_第3张图片

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()

【OpenCV-Python】12.OpenCV的阈值处理_第4张图片

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()

【OpenCV-Python】12.OpenCV的阈值处理_第5张图片

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()

【OpenCV-Python】12.OpenCV的阈值处理_第6张图片

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-Python】12.OpenCV的阈值处理_第7张图片

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

  自适应阈值处理(局部阈值处理),它通过计算每个像素点领域的加权平均值来确定阈值,并用该阈值处理当前像素点。全局阈值处理适用于色彩均衡的图像,自适应阈值处理则适用于明暗差异较大的图像。
  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】12.OpenCV的阈值处理_第8张图片


三、OpenCV-Python资源下载

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


总结

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

你可能感兴趣的:(OpenCV-Python,opencv,python,计算机视觉)