OpenCV-二值化方法

将像素点的灰度值变为0或255

(一)简单阈值

 cv2.threshold()选取一个全局阈值。

ret,dst = threshold(src,thresh,maxval,type)

参数:原图像、阈值,修改后新的阈值、方法选择。

常用的有:
• cv2.THRESH_BINARY——像素值超过阈值的取maxval,通道像素值低于阈值的取0
• cv2.THRESH_BINARY_INV——像素值超过阈值的取0,通道像素值低于阈值的取maxval
• cv2.THRESH_TRUNC ——像素值超过阈值的取maxval,通道像素值低于阈值的取自身
• cv2.THRESH_TOZERO ——超过阈值不变,低于阈值取0
• cv2.THRESH_TOZERO_INV——超过阈值0,低于阈值取不变

【OpenCV】基于cv2的图像阈值化处理【超详细的注释和解释】掌握基本操作_cv2matchtemplate 设阈值-CSDN博客

import cv2
from matplotlib import pyplot as plt


img = cv2.imread("Cat.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, th1 = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
ret, th2 = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
ret, th3 = cv2.threshold(gray, 127, 255, cv2.THRESH_TRUNC)
ret, th4 = cv2.threshold(gray, 127, 255, cv2.THRESH_TOZERO)
ret, th5 = cv2.threshold(gray, 127, 255, cv2.THRESH_TOZERO_INV)

titles = [
    "img",
    "BINARY",
    "BINARY_INV",
    "THRESH_TRUNC",
    "THRESH_TOZERO",
    "THRESH_TOZERO_INV",
]
images = [img, th1, th2, th3, th4, th5]
for i in range(6):
    # print(i)
    plt.subplot(2, 3, i + 1), plt.imshow(images[i], "gray")
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()

注:为什么变色了???????? cv2.imshow正常

 (二)自适应阈值

 cv2.AdaptiveThreshold()选取一个局部性阈值。

参数:原图像、满足条件像素点需要设置的灰度值、自适应方法、二值化方法、分割计算的区域大小(取奇数)、阈值等于均值或加权值减去常数C的最终阈值。

自适应方法:

• cv2.ADAPTIVE_THRESH_MEAN_C——邻域内均值

• cv2.ADAPTIVE_THRESH_GAUSSIAN_C——高斯加权和,将区域中像素点周围的像素根据高斯函数加权计算他们离中心点的距离。

二值化方法:THRESH_BINARY或者THRESH_BINARY_INV

dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
img = cv2.imread("Cat.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, th1 = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
th2 = cv2.adaptiveThreshold(
    gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2
)
th3 = cv2.adaptiveThreshold(
    gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2
)
images = [gray, th1, th2, th3]
titles = ["gray", "threshold-b", "adaptive-mean", "adaptive-gau"]
for i in range(4):
    plt.subplot(2, 2, i + 1), plt.imshow(images[i], "gray")
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()

(三)Otsu’s

        Otsu’s(大津法JAN)自主找到一个认为最好的阈值。Otsu’s非常适合于图像灰度直方图具有双峰的情况,他会在双峰之间找到一个值作为阈值,对于非双峰图像(灰度直方图),可能并不是很好用。 

img = cv2.imread("Cat.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 简单二值化
ret1, th1 = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# OTSU
ret2, th2 = cv2.threshold(gray, 128, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)
print("ret2", ret2)
plt.figure()
plt.subplot(221), plt.imshow(gray, "gray"), plt.title("gray")
plt.subplot(222), plt.hist(gray.ravel(), 256), plt.title("ravel")  # 一维
plt.subplot(223), plt.imshow(th1, "gray"), plt.title("BINARY")
plt.subplot(224), plt.imshow(th2, "gray"), plt.title("OTSU")
plt.show()

 参考博客:OpenCV:二值化函数cv2.threshold_opencv二值化函数-CSDN博客

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值