步骤:
1. 自定义初始的分割阈值,一般情况下,初始分割阈值是图像灰度平均值T
2. 根据T图像分割为前景和背景,又分别算出前景和背景的平均灰度T1和T2
3. 计算新的阈值T3=(T1+T2)/2
4.如果T3==T,则迭代结束,T是最终阈值,否则令T=T3,走步骤2
代码实现:
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
def showImage(name,img):
plt.imshow(img,cmap="gray")
plt.title(name)
plt.show()
def IterationThreshold(img):
m=img.mean()
#分割前景和背景
while True:
t1=img[img<m].mean()
t2=img[img>=m].mean()
t=(t1+t2)/2
#如果新的阈值t==m,迭代结束
if abs(m-t)<1:
break;
m=t
#用阈值m进行二值化,把图像的前景和背景分隔开
img2=np.where(img>=m,255,0)
img2=img2.astype(np.uint8)
return img2
if __name__=="__main__":
img=cv.imread("../image/goldpig.jpg",0)
img2=IterationThreshold(img)
showImage("img",img)
showImage("img2",img2)
运行结果: