@[toc]
目录
1、cv2.threshold()函数
2、cv2.adaptiveThreshold()函数
3、3、什么时候用cv2.adaptiveThreshold()函数
一、cv2.threshold()函数
ret, th = cv2.threshold(src, thresh, maxval, type)
#src表示输入的图片, thresh表示阈值, maxval表示最大值, type表示阈值的类型
type的类型
1.cv2.THRESH_BINARY 表示阈值的二值化操作,大于阈值使用maxval表示,小于阈值使用0表示 |
2. cv2.THRESH_BINARY_INV 表示阈值的二值化翻转操作,大于阈值的使用0表示,小于阈值的使用最大值表示 |
3. cv2.THRESH_TRUNC 表示进行截断操作,大于阈值的使用阈值表示,小于阈值的不变 |
4. cv2.THRESH_TOZERO 表示进行化零操作,大于阈值的不变,小于阈值的使用0表示 |
5. cv2.THRESH_TOZERO_INV 表示进行化零操作的翻转,大于阈值的使用0表示,小于阈值的不变 |
二、cv2.adaptiveThreshold()函数
cv2.adaptiveThreshold()来实现自适应阈值
dst=cv.adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,C)
#dst代表自适应阈值处理结果。
#src代表要进行处理的原始图像。需要注意的是,该图像必须是8位单通道的图像。
#maxValue代表最大值。
#adaptiveMethod代表自适应方法。
#thresholdType 代表阈值处理方式,该值必须是 cv2.THRESH_BINARY 或者cv2.THRESH_BINARY_INV中的一个。
#blockSize代表块大小。表示一个像素在计算其阈值时所使用的邻域尺寸,通常为3、5、7等。
#C是常量。
adaptiveMethod代表自适应方法
函数包含cv2.ADAPTIVE_THRESH_MEAN_C和cv2.ADAPTIVE_THRESH_GAUSSIAN_C两种不同的方法。
这两种方法都是逐个像素地计算自适应阈值,自适应阈值等于每个像素由参数blockSize所指定邻域的加权平均值减去常量C。两种不同的方法在计算邻域的加权平均值时所采用的方式不同:
cv2.ADAPTIVE_THRESH_MEAN_C:邻域所有像素点的权重值是一致的。 |
cv2.ADAPTIVE_THRESH_GAUSSIAN_C:与邻域各个像素点到中心点的距离有关,通过高斯方程得到各个点的权重值。 |
代码实例:
import numpy as np
import cv2
img = cv2.imread("./12.jpg")
dst = cv2.resize(img, None, fx=0.5, fy=0.5,
interpolation=cv2.INTER_CUBIC)#调整图片大小
dst = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY)
rett,th1 = cv2.threshold(dst,127,255,cv2.THRESH_BINARY)
th2 = cv2.adaptiveThreshold(dst,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
cv2.THRESH_BINARY,11,2)
#print(th2)
th3 = cv2.adaptiveThreshold(dst,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY,11,2)
#print(th3)
cv2.imshow("orignal.jpg",dst)
cv2.imshow("threshold.jpg",th1)
cv2.imshow("adaptiveThreshold-MEAN.jpg",th2)
cv2.imshow("adaptiveThreshold-GAUSSIAN.jpg",th3)
cv2.imwrite("orignal.jpg",dst)
cv2.imwrite("threshold.jpg",th1)
cv2.imwrite("adaptiveThreshold-MEAN.jpg",th2)
cv2.imwrite("adaptiveThreshold-GAUSSIAN.jpg",th3)
print(dst)
print(th1)
print(th2)
print(th3)
cv2.waitKey(0)
输出结果对比:
#print(dst):
[[123 123 123 ... 143 143 142]
[123 123 123 ... 143 142 141]
[123 123 123 ... 142 141 140]
...
[ 61 57 55 ... 132 132 135]
[ 66 68 73 ... 132 132 135]
[ 77 76 76 ... 132 134 136]]
# print(th1):
[[ 0 0 0 ... 255 255 255]
[ 0 0 0 ... 255 255 255]
[ 0 0 0 ... 255 255 255]
...
[ 0 0 0 ... 255 255 255]
[ 0 0 0 ... 255 255 255]
[ 0 0 0 ... 255 255 255]]
# print(th2):
[[255 255 255 ... 255 255 255]
[255 255 255 ... 255 255 255]
[255 255 255 ... 255 255 0]
...
[255 255 255 ... 0 0 255]
[255 255 255 ... 0 0 255]
[255 255 255 ... 0 255 255]]
# print(th3):
[[255 255 255 ... 255 255 255]
[255 255 255 ... 255 255 255]
[255 255 255 ... 255 255 255]
...
[255 255 255 ... 0 0 255]
[255 255 255 ... 0 0 255]
[255 255 255 ... 0 255 255]]
输出图片对比:
左边是原图,右边是经过灰度处理的图像
左边是cv2.threshold的图
中间是cv2.adaptiveThreshold(dst,255,cv2.ADAPTIVE_THRESH_MEAN_C,\ cv2.THRESH_BINARY,11,2)的图
右边是cv2.adaptiveThreshold(dst,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\ cv2.THRESH_BINARY,11,2)的图
三、什么时候用cv2.adaptiveThreshold()函数
可以看到经过二值化后的图有的部分偏暗,导致二值化后变成全黑,丢失了所有细节,原因threshold函数使用一个阈值对图像进行二值化,导致小于这个阈值的像素点全都变成0。因此使用一个阈值的二值化方法并不适用于上面的这张图。
如何解决这个问题?最简单的方法就是把图分成几个区域,每个区域分别进行二值化,也就是说二值化上面这张图需要不同的阈值按照这个思想,因此有了cv2.adaptiveThreshold函数,也因此在这个情况下需要用cv2.adaptiveThreshold()函数。