OpenCV二值化--cv2.threshold()函数、cv2.adaptiveThreshold()函数

@[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_Ccv2.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()函数。

 

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值