1.直方图阈值:使用与双峰图像
# 直方图阈值
plt.hist(image.ravel(),256,[0,256]) # 需要一维数组所以拉平image.ravel()
plt.hist(image.flatten(),np.arange(-0.5,256,1)) #另一种绘制直方图的方法
_, img_bin = cv.threshold(image,125,255,cv.THRESH_BINARY) #根据直方图找阈值,二值化
show(img_bin)
2.三角法阈值:不太好用,最早用来分隔染色体图像。使用单峰图像
plt.hist(image.ravel(),256,[0,256])
plt.show()
th, img_bin = cv.threshold(image,0,255,cv.THRESH_TRIANGLE) #th代表自动找阈值,0是随便输的参数,代表随机找到的阈值
show(img_bin) #cv.THRESH_TRIANGLE 专门为这种方法配的显示方式
3.迭代法阈值分割
# 迭代法求阈值
T = image.mean()
while True:
t0 = image[image<T].mean()
t1 = image[image>=T].mean()
t = (t0+t1)/2
if T==t:
break
T=t
print(T)
4.大津法(OTSU)
# 大津法
th, img_bin = cv.threshold(image,0,255,cv.THRESH_OTSU)
#th代表自动找阈值,0是随便输的参数,代表随机找到的阈值
#cv.THRESH_OTSU 专门为这种方法配的显示方式
opencv 自带接口
5.自适应阈值分割
# 自适应阈值分割
img_bin = cv.adaptiveThreshold(image,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,61,0)
# 第三个参数位置适应的方法两种:平均值适应,高斯适应
# 61:窗口大小,一般比目标的窗口大一点,取奇数
# 0:取整数