import cv2 as cv
img = cv.imread('./shangyi.jpg',cv.IMREAD_COLOR)
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#固定阈值 手动决定thresh大小
#src:灰度图资源 thresh:阈值 maxval:像素最大值 type:像素值分配方式
#将灰度图中的灰度值进行二值化变换,变换方式由type决定
# eq:cv.THRESH_BINARY表示大于thresh的灰度值会转为maxval,小于thresh的灰度值会转为0
ret,thresh1 = cv.threshold(gray,127,255,cv.THRESH_BINARY)
ret,thresh2 = cv.threshold(gray,127,255,cv.THRESH_BINARY_INV)
ret,thresh3 = cv.threshold(gray,127,255,cv.THRESH_TRUNC)
ret,thresh4 = cv.threshold(gray,127,255,cv.THRESH_TOZERO)
ret,thresh5 = cv.threshold(gray,127,255,cv.THRESH_TOZERO_INV)
#不同类型的转换方式对比
cv.namedWindow('img',cv.WINDOW_NORMAL)
cv.resizeWindow('img',200,100)
cv.imshow('img',thresh1)
cv.waitKey(0)
cv.imshow('img',thresh2)
cv.waitKey(0)
cv.imshow('img',thresh3)
cv.waitKey(0)
cv.imshow('img',thresh4)
cv.waitKey(0)
cv.imshow('img',thresh5)
cv.waitKey(0)
cv.destroyAllWindows()
#自适应阈值 thresh由自适应方法动态得出,一张灰度图中可以分成多个区域阈值
#src:灰度图资源 maxval:像素最大值 adaptiveMethod:自适应方式 thresholdType:像素值分配方式 blockSize:区域块大小(必须是大于1的奇数) C:常数C(偏移量,用于矫正阈值)
#eq:cv.ADAPTIVE_THRESH_GAUSSIAN_C表示每个区域块的阈值,由区域块内每个像素的灰度值经过高斯函数加权相乘后再相加,最后减去常量C得出
adaptive_thresh1 = cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,225,0) #自适应高斯加权
adaptive_thresh2 = cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,225,0) #自适应平均 缺点是可能会忽略掉区域内某些特殊的像素值=>例如照片中衣服上的花纹
#不同类型的自适应方式对比
cv.namedWindow('img',cv.WINDOW_NORMAL)
cv.resizeWindow('img',200,100)
cv.imshow('img',adaptive_thresh1)
cv.waitKey(0)
cv.imshow('img',adaptive_thresh2)
cv.waitKey(0)
cv.destroyAllWindows()
# Otsu阈值 自动获取全局阈值,即无需手动决定阈值大小,阈值thresh大小默认0即可
ret,otsu_thresh1 = cv.threshold(gray,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)
#ret 自动获取出来的值为99与原来的手动设置的127有一定的差距
ret,otsu_thresh2 = cv.threshold(gray,0,255,cv.THRESH_TOZERO+cv.THRESH_OTSU)
cv.namedWindow('img',cv.WINDOW_NORMAL)
cv.resizeWindow('img',200,100)
cv.imshow('img',otsu_thresh1)
cv.waitKey(0)
cv.imshow('img',otsu_thresh2)
cv.waitKey(0)
cv.destroyAllWindows()
这里介绍了3种方式的二值化:
1.手动自定义全局阈值进行二值化
2.利用Otus算法自动获取图像的全局阈值,再进行二值化
3.将图片分区域块,再利用自适应函数针对每个区域计算出相应的阈值,再分别对其二值化