1、简单阈值设置

     像素值高于阈值时,给这个像素赋予一个新值(可能是白色),否则我们给它赋予另外一种颜色(也许是黑色)。这个函数就是 cv2.threshhold()。这个函数的第一个参数就是原图像,原图像应该是灰度图。第二个参数就是用来对像素值进行分类的阈值。第三个参数就是当像素值高于(有时是小于)阈值时应该被赋予的新的像素值。 OpenCV提供了多种不同的阈值方法,这是有第四个参数来决定的。这些方法包括: 
• cv2.THRESH_BINARY 
• cv2.THRESH_BINARY_INV 
• cv2.THRESH_TRUNC 
• cv2.THRESH_TOZERO 
• cv2.THRESH_TOZERO_INV 

这个函数有两个返回值,第一个为 retVal,我们后面会解释。第二个就是阈值化之后的结果图像了. 

import cv2 as cv


def binary_img_demo(img):
    gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    print(ret)
    cv.imshow("binary", binary)


src = cv.imread("./../img/8.png") # 读取图像
cv.namedWindow("input img", cv.WINDOW_AUTOSIZE)
cv.imshow("input img", src) # 显示图像

binary_img_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

opencv java Mat 颜色改变 opencv颜色阈值_显示图像

ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_TOZERO)

opencv java Mat 颜色改变 opencv颜色阈值_显示图像_02

ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_TRIANGLE)

 

opencv java Mat 颜色改变 opencv颜色阈值_二值化_03

2 、自适应阈值 

     在前面的部分我们使用是全局阈值,整幅图像采用同一个数作为阈值。但是这种方法并不适应与所有情况,尤其是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。这种方法需要我们指定三个参数,返回值只有一个。 
• Adaptive Method- 指定计算阈值的方法。 
– cv2.ADPTIVE_THRESH_MEAN_C:阈值取自相邻区域的平均值 
– cv2.ADPTIVE_THRESH_GAUSSIAN_C:阈值取值相邻区域的加权和,权重为一个高斯窗口。 
• Block Size - 邻域大小(用来计算阈值的区域大小)。 
• C - 这就是是一个常数,阈值就等于的平均值或者加权平均值减去这个常数。 
 

先来个简单的自定义

import cv2 as cv


def binary_img_demo(img):
    gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 75, 255, cv.THRESH_BINARY)
    print(ret)
    cv.imshow("binary", binary)


src = cv.imread("./../img/8.png") # 读取图像
cv.namedWindow("input img", cv.WINDOW_AUTOSIZE)
cv.imshow("input img", src) # 显示图像

binary_img_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

opencv java Mat 颜色改变 opencv颜色阈值_显示图像_04

来个高级的

import cv2 as cv


def binary_img_demo(img):
    gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    binary = cv.adaptiveThreshold(gray,255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 11, 2)
    cv.imshow("binary", binary)


src = cv.imread("./../img/8.png") # 读取图像
cv.namedWindow("input img", cv.WINDOW_AUTOSIZE)
cv.imshow("input img", src) # 显示图像

binary_img_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

 

opencv java Mat 颜色改变 opencv颜色阈值_二值化_05

binary = cv.adaptiveThreshold(gray,255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 11, 2)

opencv java Mat 颜色改变 opencv颜色阈值_二值化_06

更改一下值,效果会更好 

binary = cv.adaptiveThreshold(gray,255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 25, 10)

opencv java Mat 颜色改变 opencv颜色阈值_显示图像_07

binary = cv.adaptiveThreshold(gray,255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)

opencv java Mat 颜色改变 opencv颜色阈值_读取图像_08

3、超大图像二值化 

超大图像二值化的方法:分块、全局阈值与局部阈值

import cv2 as cv


def big_img_binary(img):
    h, w = img.shape[:2]
    ch = 256
    cw = 256
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    for row in range(0, h, ch):
        for col in range(0, w, cw):
            roi = gray[row:row + ch, col:col + cw]
            dst = cv.adaptiveThreshold(roi, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 127, 20)
            gray[row:row + ch, col: col + cw] = dst
    cv.imshow("big_img_binary/", gray)


src = cv.imread("./../img/b.jpg") # 读取图像
cv.namedWindow("input img", cv.WINDOW_AUTOSIZE)
big_img_binary(src)
cv.waitKey(0)
cv.destroyAllWindows()

4 、Otsu’s 二值化