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为阈值类型
在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中的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中的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中的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中的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()
对于色彩不均衡的图像,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()
三角算法阈值处理最早见于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-4.5.4源码
以上内容介绍了OpenCV-Python中几种基本阈值处理的操作,有关Python、数据科学、人工智能等文章后续会不定期发布,请大家多多关注,一键三连哟(●’◡’●)。