1、均值法
计算图片的色彩平均值,然后大于阈值的设置为255,小于阈值的设置为0。
2、OTSU
通过寻找类内最小方差:即先将图像按照色彩画出直方图。按色彩值分成两个大类,使每个类的方差最小。
3、三角法
代码如下:
def binary_segmetation_demo():
src = cv.imread("D:/pythonTest/img/1.jpg",cv.IMREAD_GRAYSCALE)
cv.imshow("input",src)
ret,dst = cv.threshold(src,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU)
#ret用于接收算法得出的阈值
cv.imshow("output",dst)
print(ret)
上面的代码的OTSU的效果如下:
全局阈值的缺点:对光照不均匀的图像容易出现错误的二值分割。
自适应阈值是先对图像进行模糊求差值,再二值化。
代码如下:
def binary_segmetation_demo():
src = cv.imread("D:/pythonTest/img/1.jpg",cv.IMREAD_GRAYSCALE)
cv.imshow("input",src)
#ret,dst = cv.threshold(src,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU)
dst = cv.adaptiveThreshold(src,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,25,10)
#倒数第二个参数是blocks,必须是奇数
#ret用于接收算法得出的阈值
cv.imshow("output",dst)
上述代码的效果如下:
先去噪(用高斯模糊等)再二值化会有较好的效果,代码如下:
src = cv.GaussianBlur(src,(7,7),0)
dst = cv.adaptiveThreshold(src,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,25,10)