opencv+python入门学习之四 二值化图像

二值化:像素点的灰度值设置为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)

双峰法:一种简单的图像分割算法,双峰法图像二值化就是利用图像灰度直方图呈明显的双峰状,则选取双峰间的最低谷出作为图像分割的阈值所在。

猜你喜欢

转载自blog.csdn.net/liuyang_1106/article/details/88257321