三种阈值

简单阈值:是固定一个阈值(一个数)
自适应阈值:阈值即取相邻领域(小邻域-阈值)(很多阈值)
Otsu’s二值化:是自己学习一个阈值(一个数)

简单阈值

正如它的名字,直接根据给定的阈值进行判断,大于则为1,小于则为0。之前使用的熟悉的阈值函数cv2.threshold()便是这种。 这里简单回顾。其第一个参数是需要二值化的图像,第二个参数是阈值,第三个参数是当像素值高于(或小于)阈值时应该被赋予的 新像素值。OpenCV提供了多种不同的阈值方法。我们之前用的便是cv2.THRESH_BINARY。函数的返回值有两个,第二个即为二值化 以后的图像。因此不能只用一个变量接收这个函数的返回值,否则会报错的。同时需要注意的是,传入函数的图像应该是灰度图像, 而不是RGB图像,RGB的话需要先转换成灰度再传入,否则可能得到的不是你想要的结果。

import numpy as np
import cv2
from matplotlib import pyplot as plt

gray = cv2.imread("E:/ruanjianDM/jupyternoerbookDM/Opencv3/data/gray.jpg")

ret, thresh1 = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(gray, 128, 255, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(gray, 128, 255, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(gray, 128, 255, cv2.THRESH_TOZERO_INV)

titles = ['original', 'binary', 'binary_inv', 'trunc', 'tozero', 'tozero_inv']
imgs = [gray, thresh1, thresh2, thresh3, thresh4, thresh5]

for i in range(6):
    plt.subplot(3, 2, i + 1), plt.imshow(imgs[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([]) #去除坐标轴
plt.show()

opencv二值图像骨架提取 opencv二值化阈值怎么设置_自适应

自适应阈值

OpenCV中自适应阈值采用cv2.adaptiveThreshold() 函数实现。OpenCV中内置了两种自适应方法,分别是cv2.ADAPTIVE_THRESH_MEAN_C和cv2.ADAPTIVE_THRESH_GAUSSIAN_C。 MEAN_C方法很简单,阈值即取相邻领域的平均值。GAUSSIAN_C方法阈值同样取自相邻领域,只是不再是平均值,而是加权平均, 权重为一个高斯窗口。所谓高斯窗口就是要让窗口服从二维的高斯正态分布。

import numpy as np
import cv2
from matplotlib import pyplot as plt
img=cv2.imread("E:/ruanjianDM/jupyternoerbookDM/Opencv3/data/ii.jpg")
#图像缩放函数 :4x4像素邻域的双三次插值
resize = cv2.resize(img, None, fx=0.6, fy=0.6, interpolation=cv2.INTER_CUBIC)

gray = cv2.cvtColor(resize, cv2.COLOR_BGR2GRAY)

ret, th1 = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY)#ret=128
"""
# 第一个参数是需要二值化的图像,注意要是灰度图
# 第二个参数是大于阈值时应该被赋予的值
# 第三个参数是阈值计算方法,MEAN或GAUSSIAN二选一
# 第四个参数是阈值显示方法,只能是BINARY或BINARY_INV二选一
# 第五个参数是领域大小,注意必须是奇数,该值越大,保留的细节越少。
# 第六个参数是自定义的常数
"""
th2 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 2)
th3 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 9, 2)
cv2.imshow("original", resize)
cv2.imshow("th_binary", th1)
cv2.imshow("mean", th2)
cv2.imshow("gauss", th3)
cv2.waitKey(0)

opencv二值图像骨架提取 opencv二值化阈值怎么设置_OpenCV_02

Otsu’s二值化

Otsu’s简单来说就是对一幅双峰图像自动根据其灰度分布直方图计算出一个最合适的二值化阈值。对于非 双峰图像,这种方法的效果可能不理想。 在使用时,我们需要多传入一个参数:cv2.THRESH_OTSU,并且要把阈值设为0。然后程序便会根据算法找到 最优阈值,并返回给retVal。如果不使用Otsu二值化,返回的值便于我们设定的相等。

import numpy as np
import cv2
from matplotlib import pyplot as plt
imggray= cv2.imread("E:/ruanjianDM/jupyternoerbookDM/Opencv3/data/ii.jpg",0)
# 注意还要再加上一个参数
ret1, th1 = cv2.threshold(imggray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
ret2, th2 = cv2.threshold(imggray, 128, 255, cv2.THRESH_BINARY)
cv2.imshow("otsu", th1)
cv2.imshow("binary_128", th2)
cv2.waitKey(0)

opencv二值图像骨架提取 opencv二值化阈值怎么设置_二值化_03