阈值化threshold(),自适应阈值adaptiveThreshold()

1阈值化

图像分割的一种:图像的阈值化(有些场合也称二值化)是图像分割的一种,一般用于将感兴趣区域从背景中区分出来,处理过程就是将每个像素和阈值进行对比,分离出来需要的像素设置为特定白色的255或者黑色的0,具体看实际的使用需求而定。

threshold函数接口形式:cv2.threshold(src, thresh, maxval, type[, dst]) ->retval, dst
该方法返回2个值,第1个值retval为阈值,第2个值dst为阈值化后的图像。
参数含义:

src:源图像,8bit或者32bit浮点类型,当type没有使用cv2.THRESH_OTSU或cv2.THRESH_TRIANGLE标志时可以是多通道图像;
thresh:比较的阈值;
maxval:阈值化方法为THRESH_BINARY和THRESH_BINARY_INV时单个像素转换后的最大值;
type:阈值化类型;

img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
thr_val, img_ret11 = cv2.threshold(img_gray, 50, 255, cv2.THRESH_BINARY )
thr_val, img_ret12 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY )
thr_val, img_ret13 = cv2.threshold(img_gray, 200, 255, cv2.THRESH_BINARY_INV )
thr_val, img_ret21 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC )
thr_val, img_ret22 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO )
thr_val, img_ret23 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV )
thr_val, img_ret31 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)
thr_val, img_ret32 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY|cv2.THRESH_TRIANGLE)

当type设置了cv2.THRESH_OTSU或cv2.THRESH_TRIANGLE标志时,入参thresh没有实际意义,图像并不会跟随thresh发生变化,这是因为该方法会根据图像自动计算阈值,这时threshold()函数返回的第1个值就是自动计算出来的阈值。

thresh,img_bin = cv2.threshold(img_gray,127,255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)

threshold()在一张图片中使用了一个特定的阈值进行二值化,要么是在入参thresh中指定阈值,要么是在设置了cv2.THRESH_OTSU或cv2.THRESH_TRIANGLE标志时根据图像像素值自动计算阈值,不管哪种方法都是同一张图片使用同一个阈值。
在某些情况下一张图片因为光线的差异,可能某一个区域的亮度和其他区域相比差异较大,这时整幅图像使用单一数值阈值化后得到的图片效果可能就会很差。

2.自适应阈值

adaptiveThreshold()的接口形式:

cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) ->dst

src:源图像;
maxValue:单个像素转换后的最大值;
adaptiveMethod:自适应方法:cv2.ADAPTIVE_THRESH_MEAN_C(平均法)或cv2.ADAPTIVE_THRESH_GAUSSIAN_C(高斯法)
thresholdType:阈值化类型,THRESH_BINARY或THRESH_BINARY_INV二选一;
blockSize:计算某个像素使用的阈值时采用的窗口大小,奇数值;
C:平均值或加权平均值减去的常量值;可以为正值,0或负值;

adaptiveMethod参数详解:
cv2.ADAPTIVE_THRESH_MEAN_C(平均法):这时阈值等于窗口大小为blockSize的临近像素点的平均值减去C;
cv2.ADAPTIVE_THRESH_GAUSSIAN_C(高斯法):阈值等于窗口大小为blockSize的临近像素点高斯窗口互相关加权和减去C。

import cv

img = cv2.imread('..\\leaf.jpeg') 
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('img',img)
thresh,img_bin = cv2.threshold(img_gray,10,255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)
cv2.imshow('threshold',img_bin)
img_ret11 = cv2.adaptiveThreshold(img_gray,255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,55,0 ) 
cv2.imshow('adaptiveThreshold',img_ret11)
img_ret12 = cv2.adaptiveThreshold(img_gray,255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,55,0 ) 
cv2.imshow('adaptive2',img_ret12)
cv2.waitKey()

threshold()方法使用大津法和三角法时不需要指定阈值,会自动根据像素值求出阈值,其他方法则需要指定阈值的大小。threshold()方法使用全局单一阈值,而adaptiveThreshold()方法使用局部阈值,所以在处理光线不均匀图片时能取得更好的效果。

猜你喜欢

转载自blog.csdn.net/aqiangdeba/article/details/129766392