PythonOpenCV-图像变换-阈值处理
0. 简介
阈值处理用于剔除图像中像素值高于或低于指定值的像素点
1. 全局阈值处理
全局阈值处理是指将大于阈值的像素值设置为 255,将其他像素值设置为0;或者将大于阈值的像素值设置为 0,将其他像素值设置为 255
OpenCV的 cv2.threshold()函数用于实现全局闯值处理,其基本格式如下:
retval,dst = cv2.threshold(src, threshold, maxval, type)
参数说明:
retval:返回的阈值
dst:阈值处理后的图像
src:原图像
thresh:设置的阈值
maxval:阈值类型为THRESH_BINARY和THRESH_BINARY_INV时使用的最大值
type:阈值类型
1-1. 二值化阈值处理
cv2.threshold()函数的 type 参数值为 cv2.THRESH_BINARY 时执行二值化阈值处理,将大于阈值的像素值设置为 255,将其他像素值设置为 0。
代码示例:
import cv2 as cv img_src = cv.imread('./Pictures/lena.jpg', cv.IMREAD_ANYCOLOR) cv.imshow('src', img_src) retval, img_dst = cv.threshold(img_src, 79, 255, type=cv.THRESH_BINARY) cv.imshow('dst', img_dst) cv.waitKey(0)
运行结果:
1-2. 反二值化阈值处理
cv2threshold()函数的 type 参数值为 cv2.THRESH_BINARY_INV 时执行反二值化阈值处理,将大于阈值的像素值设置为 0,将其他像素值设置为 255。
代码示例:
import cv2 as cv img_src = cv.imread('./Pictures/lena.jpg', cv.IMREAD_ANYCOLOR) cv.imshow('src', img_src) retval, img_dst = cv.threshold(img_src, 79, 255, type=cv.THRESH_BINARY_INV) cv.imshow('dst', img_dst) cv.waitKey(0)
运行结果:
1-3. 截断阈值处理
cv2.threshold()函数的 type 参数值为 cv2.THRESH_TRUNC 时执行截断阈值处理,将大于阈值的像素值设置为阈值,其他像素值保持不变。
代码示例:
import cv2 as cv img_src = cv.imread('./Pictures/lena.jpg', cv.IMREAD_ANYCOLOR) cv.imshow('src', img_src) retval, img_dst = cv.threshold(img_src, 79, 255, type=cv.THRESH_TRUNC) cv.imshow('dst', img_dst) cv.waitKey(0)
运行结果:
1-4. 超阈值零处理
cv2.threshold()函数的 type 参数值为 cv2.THRESH_TOZERO_INV 时执行超阈值零处理,将大于阈值的像素值设置为 0,其他像素值保持不变。
代码示例:
import cv2 as cv img_src = cv.imread('./Pictures/lena.jpg', cv.IMREAD_ANYCOLOR) cv.imshow('src', img_src) retval, img_dst = cv.threshold(img_src, 79, 255, type=cv.THRESH_TOZERO) cv.imshow('dst', img_dst) cv.waitKey(0)
运行结果:
1-5. 低阈值零处理
cv2.threshold()函数的 type 参数值为 cv2.THRESH_TOZERO 时执行低阈值零处理,将小于阈值的像素值设置为 0,其他像素值保持不变。
代码示例:
import cv2 as cv img_src = cv.imread('./Pictures/lena.jpg', cv.IMREAD_ANYCOLOR) cv.imshow('src', img_src) retval, img_dst = cv.threshold(img_src, 79, 255, type=cv.THRESH_TOZERO_INV) cv.imshow('dst', img_dst) cv.waitKey(0)
运行结果:
1-6. Otsu算法阈值处理
对于色彩不均衡的图像,Otsu 算法阈值处理方式更好,它会遍历当前图像的所有阈值,再选择最佳阈值。
cv2.threshold()函数通过在阈值类型参数后加上 cv2.THRESH_OTSU 来实现 Otsu 算法阈值处理。
代码示例:
import cv2 as cv img_src = cv.imread('./Pictures/lena.jpg', cv.IMREAD_GRAYSCALE) cv.imshow('src', img_src) retval, img_dst = cv.threshold(img_src, 155, 255, type=cv.THRESH_OTSU) cv.imshow('dst', img_dst) cv.waitKey(0)
运行结果:
1-7. 三角形算法阈值处理
cv2.threshold()函数通过在阈值类型参数后加上cv2.THRESH_TRIANGLE来实现三角算法阈值处理。
代码示例:
import cv2 as cv img_src = cv.imread('./Pictures/lena.jpg', cv.IMREAD_GRAYSCALE) cv.imshow('src', img_src) retval, img_dst = cv.threshold(img_src, 155, 255, type=cv.THRESH_TRIANGLE) cv.imshow('dst', img_dst) cv.waitKey(0)
运行结果:
2. 自适应阈值处理
自适应阈值处理也称局部阈值处理,它通过计算每个像素点邻域的加权平均值来确定阈值,并用该阈值处理当前像素点。
全局阈值处理适用于色彩均衡的图像,自适应闯值处理则适用于明暗差异较大的图像。
OpenCv的 cv2.adaptiveThreshold()函数用于实现自适应闯值处理,其基本格式如下:
dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
参数说明:
dst:阈值处理后的图像
src:原图像
maxValue:最大值
type:阈值类型
adaptiveMethod:自适应方法,其值为 cv2.ADAPTIVE_THRESH_MEAN_C(邻域中所有像素点的权重值相同)或者 cv2.ADAPTIVETHRESH_GAUSSIAN_C(域中像素点的权重值与其到中心点的距离有关,通过高斯方程可计算各个点的权重值)
thresholdType:阈值处理方式,其值为 cv2.THRESH_BINARY(二值化值处理)或者cv2.THRESH_BINARY_INV (反二值化值处理)
blockSize:计算局部阈值的邻域的大小
C:常量,自适应阈值为 blockSize 指定邻域的加权平均值减去 C
代码示例:
import cv2 as cv img_src = cv.imread('./Pictures/lena.jpg', cv.IMREAD_GRAYSCALE) cv.imshow('src', img_src) img_dst = cv.adaptiveThreshold(img_src, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 5, 10) cv.imshow('dst', img_dst) cv.waitKey(0)
运行结果:
/*-------------------------------------------------------------------------------------------------------
笔者说明:
该笔记来源于本人学习Python + OpenCv时的资料,
分享出来只是为了供大家学习,并且为了自己以后想要用的时候方便寻找。
时间:2023年8月22日
------------------------------------------------------------------------------------------------------------*/