学习视频可参见python+opencv3.3视频教学 基础入门[1]
outline
二值化函数threshold
OTSU(最大类间方差法)
def threehold_demo(image):
gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY) #转换为灰度图
ret,binary=cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU) #灰度图转二值图
print("threehold value %s"%ret)
cv.imshow("binary",binary)
threehold value 117.0 #阈值为117,大于117为白,小于117为黑
Triangle
自动与手动
ret,binary=cv.threshold(gray,127,255,cv.THRESH_BINARY_INV)
cv.THRESH_TRUNC
ret,binary=cv.threshold(gray,127,255,cv.THRESH_TRUNC)
cv.THRESH_TOZERO
ret,binary=cv.threshold(gray,127,255,cv.THRESH_TOZERO)
adaptiveThreshold (自适应阈值)
adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
#返回二值化后的图像矩阵-> dst
src参数:表示输入图像(8位单通道图像),灰度图。
maxValue参数:表示使用 THRESH_BINARY 和 THRESH_BINARY_INV 的最大值.
adaptiveMethod参数:表示自适应阈值算法,平均 (ADAPTIVE_THRESH_MEAN_C)或高斯(ADAPTIVE_THRESH_GAUSSIAN_C)。
thresholdType参数:表示阈值类型,必须为THRESH_BINARY或THRESH_BINARY_INV的阈值类型。
blockSize参数:表示块大小(奇数且大于1,比如3,5,7........ )。
C参数:常数,表示从平均值或加权平均值中减去的数。 通常情况下,这是正值,但也可能为零或负值
均值-c>0为白
一般情况下blocksize过大会导致图像细节的丢失,过小虽然保存了图像细节,但是也使得运行的时间大幅增加,因此需要进行权衡。
一般情况参数C是大于0的,C越大说明最后的阈值就会越小,这样导致的结果就是图像的大部分像素会被转换为亮域,即更多的像素点的灰度值大于阈值,被转化为255亮域。C越小时则恰恰相反
def threehold_local(image):
gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
binary=cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,25,10)
#binary=cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,25,10)
cv.imshow("binary",binary)
遇到比较大的图像处理
[1]
python+opencv3.3视频教学 基础入门: https://www.bilibili.com/video/BV1QW411F7e7?p=1
[2]
基于Otsu的全局阈值处理的实现: https://blog.csdn.net/m0_38061927/article/details/77362877
[3]
【图像处理】——图像的二值化操作及阈值化操作: https://blog.csdn.net/qq_45769063/article/details/107102117#%EF%BC%882%EF%BC%89%E4%B8%89%E8%A7%92%E6%B3%95TRIANGLE%E9%98%88%E5%80%BC%E7%B1%BB%E5%9E%8B%E2%80%94%E2%80%94%E9%80%82%E7%94%A8%E4%BA%8E%E5%8D%95%E5%B3%B0%E7%9B%B4%E6%96%B9%E5%9B%BE