二值化:像素点的灰度值设置为0或255,凸显黑白的视觉效果
实现过程:基于灰度图像,设置阈值,然后得到0或255的二值结果。
根据阈值选取的不同,二值化的算法分为固定阈值和自适应阈值。 比较常用的二值化方法则有:双峰法、P参数法、迭代法和OTSU法等。
OTSU法:最大类间方差法,是一种常用的图像分割算法。核心思想是设一个初始阈值把图像分为两类,然后计算两类之间的方差,更新阈值,重新计算类间方差,当满足类间方差最大时的阈值,即为所求最佳阈值。
方差:数据与平均数之差平方和的平均数
def Otsu(image):
img = image.copy()
sumMax = 0
bestTh = 0
for Th in range(0,255):
print("当前阈值为:%s"%Th)
a = 0;
b = 0;
sumii = 0;
sumjj = 0;
for ii in range(img.shape[0]):
for jj in range(img.shape[1]):
if img[ii, jj] >= Th:
sumii += img[ii,jj]
a +=1
else:
sumjj += img[ii, jj]
b +=1
if a == 0 or b == 0:
continue
sumii /= a
sumjj /= b
sumTh = a*b*(sumii-sumjj)**2
if sumTh > sumMax:
sumMax = sumTh
bestTh = Th
return bestTh-1
opencv 自带的库函数
ret1, th1 = cv.threshold(img, bestTh, 255, cv.THRESH_BINARY)
ret2, th2 = cv.threshold(img, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
双峰法:一种简单的图像分割算法,双峰法图像二值化就是利用图像灰度直方图呈明显的双峰状,则选取双峰间的最低谷出作为图像分割的阈值所在。