opencv Threshold


原文链接: opencv Threshold

OpenCV阈值操作(Threshold,AdaptiveThreshold) - 疯狂的LittleBee的博客 - CSDN博客

def threshold(src, thresh, maxval, type, dst=None)

thresh:Double类型的,具体的阈值。
maxval:Double类型的,阈值的最大值

type:

THRESH_BINARY 二进制阈值化 -> 大于阈值为1 小于阈值为0
THRESH_BINARY_INV 反二进制阈值化 -> 大于阈值为0 小于阈值为1
THRESH_TRUNC 截断阈值化 -> 大于阈值为阈值,小于阈值不变
THRESH_TOZERO 阈值化为0 -> 大于阈值的不变,小于阈值的全为0
THRESH_TOZERO_INV 反阈值化为0 -> 大于阈值为0,小于阈值不变
import cv2

img = cv2.imread("C:/Users/DELL/Desktop/img2.jpg")

gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

gauss = cv2.GaussianBlur(gray, (3, 3), 1)

maxvalue = 255

def onthreshold(x):
    value = cv2.getTrackbarPos("value", "Threshold")
    a, binary = cv2.threshold(gauss, value, maxvalue, cv2.THRESH_BINARY)
    b, binary_inv = cv2.threshold(gauss, value, maxvalue, cv2.THRESH_BINARY_INV)
    c, trunc = cv2.threshold(gauss, value, maxvalue, cv2.THRESH_TRUNC)
    d, to_zero = cv2.threshold(gauss, value, maxvalue, cv2.THRESH_TOZERO)
    e, to_zero_inv = cv2.threshold(gauss, value, maxvalue, cv2.THRESH_TOZERO_INV)
    if(a):
        cv2.imshow("Binary", binary)
    if(b):
        cv2.imshow("Binary_INV", binary_inv)
    if(c):
        cv2.imshow("TRUNC", trunc)
    if(d):
        cv2.imshow("TO_ZERO", to_zero)
    if(e):
        cv2.imshow("TO_ZERO_INV", to_zero_inv)

cv2.namedWindow("Threshold")
cv2.createTrackbar("value", "Threshold", 0, 255, onthreshold)
cv2.imshow("Threshold", img)
cv2.waitKey(0)

在这个方法里我要讲下,你会发现方法前面有两个参数,原因是当你进入Pycharm的方法声明中,里面是这样给你实列的:

threshold(src, thresh, maxval, type[, dst]) -> retval, dst
1
第一个retval是你的方法是否执行成功,dst是目标图像,上面懒得起名字,所以用a,b,c,d,e来代表的对应方法的Bool值。

接下来讲下adaptiveThreshold的参数:
def adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,C,dst=None)

maxval:Double类型的,阈值的最大值
adaptiveMethod:Int类型的,这里有两种选择
1 ADAPTIVE_THRESH_MEAN_C(通过平均的方法取得平均值)
2 ADAPTIVE_THRESH_GAUSSIAN_C(通过高斯取得高斯值)
不过这两种方法最后得到的结果要减掉参数里面的C值

thresholdType:Int类型的,方法如下:
THRESH_BINARY 二进制阈值化 -> 大于阈值为1 小于阈值为0
THRESH_BINARY_INV 反二进制阈值化 -> 大于阈值为0 小于阈值为1
THRESH_TRUNC 截断阈值化 -> 大于阈值为阈值,小于阈值不变
THRESH_TOZERO 阈值化为0 -> 大于阈值的不变,小于阈值的全为0
THRESH_TOZERO_INV 反阈值化为0 -> 大于阈值为0,小于阈值不变
blockSize:Int类型的,这个值来决定像素的邻域块有多大。
注意:这里的blockSize的值要为奇数,否则会给出这样的提示:
Assertion failed (blockSize % 2 == 1 && blockSize > 1) in cv::adaptiveThreshold
C:偏移值调整量,计算adaptiveMethod用到的参数。

实验中,我阈值的type选择第一种,来演示这两种方式得出的结果
当blockSize的值比较小的时候,两种方法得到的结果的差异不是很大

`