【youcans 的 OpenCV 例程200篇】159. 图像处理之固定阈值法
3.2 全局阈值处理基本方法
当图像中的目标和背景的灰度分布较为明显时,可以对整个图像使用固定阈值进行全局阈值处理。
为了获得适当的全局阈值,可以基于灰度直方图进行迭代计算:
(1)设置初始阈值 T,通常可以设为图像的平均灰度;
(2)用灰度阈值 T 分割图像:灰度值等于 T 的所有像素集合 G1 和 大于等于 T 的所有像素集合 G2;
(3)分别计算 G1、G2 的平均灰度值 m1、m2;
(4)求出新的灰度阈值
T
=
(
m
1
+
m
2
)
/
2
T=(m1+m2)/2
T=(m1+m2)/2;
(5)重复步骤(2)~(4),直到阈值变化小于设定值。
例程 11.16:图像阈值处理之固定阈值法
# 11.16 图像分割之全局阈值处理
img = cv2.imread("../images/Fig0940a.tif", flags=0)
deltaT = 1 # 预定义值
histCV = cv2.calcHist([img], [0], None, [256], [0, 256]) # 灰度直方图
grayScale = range(256) # 灰度级 [0,255]
totalPixels = img.shape[0] * img.shape[1] # 像素总数
totalGary = np.dot(histCV[:,0], grayScale) # 内积, 总和灰度值
T = round(totalGary/totalPixels) # 平均灰度
while True:
numC1, sumC1 = 0, 0
for i in range(T): # 计算 C1: (0,T) 平均灰度
numC1 += histCV[i,0] # C1 像素数量
sumC1 += histCV[i,0] * i # C1 灰度值总和
numC2, sumC2 = (totalPixels-numC1), (totalGary-sumC1) # C2 像素数量, 灰度值总和
T1 = round(sumC1/numC1) # C1 平均灰度
T2 = round(sumC2/numC2) # C2 平均灰度
Tnew = round((T1+T2)/2) # 计算新的阈值
print("T={}, m1={}, m2={}, Tnew={}".format(T, T1, T2, Tnew))
if abs(T-Tnew) < deltaT: # 等价于 T==Tnew
break
else:
T = Tnew
# 阈值处理
ret, imgBin = cv2.threshold(img, T, 255, cv2.THRESH_BINARY) # 阈值分割, thresh=T
plt.figure(figsize=(11, 4))
plt.subplot(131), plt.axis('off'), plt.title("original"), plt.imshow(img, 'gray')
plt.subplot(132, yticks=[]), plt.title("Gray Hist") # 直方图
histNP, bins = np.histogram(img.flatten(), bins=255, range=[0, 255], density=True)
plt.bar(bins[:-1], histNP[:])
plt.subplot(133), plt.title("threshold={}".format(T)), plt.axis('off')
plt.imshow(imgBin, 'gray')
plt.tight_layout()
plt.show()
(本节完)
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124281128)
Copyright 2022 youcans, XUPT
Crated:2022-4-20