赞
踩
OpenCV 例程200篇 总目录-202205更新
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
OTSU 方法又称大津算法,使用最大化类间方差(intra-class variance)作为评价准则,基于对图像直方图的计算,可以给出类间最优分离的最优阈值。
任取一个灰度值 T,可以将图像分割为两个集合 F 和 B,集合 F、B 的像素数的占比分别为 pF、pB,集合 F、B 的灰度值均值分别为 mF、mB,图像灰度值为 m,定义类间方差为:
I
C
V
=
p
F
∗
(
m
F
−
m
)
2
+
p
B
∗
(
m
B
−
m
)
2
ICV = p_F * (m_F - m)^2 + p_B * (m_B - m)^2
ICV=pF∗(mF−m)2+pB∗(mB−m)2
使类间方差 ICV 最大化的灰度值 T 就是最优阈值。
因此,只要遍历所有的灰度值,就可以得到使 ICV 最大的最优阈值 T。
# 11.18 OTSU 阈值处理算法的实现 img = cv2.imread("../images/Fig1039a.tif", flags=0) histCV = cv2.calcHist([img], [0], None, [256], [0, 256]) # 灰度直方图 scale = range(256) # 灰度级 [0,255] totalPixels = img.shape[0] * img.shape[1] # 像素总数 totalGray = np.dot(histCV[:,0], scale) # 内积, 总和灰度值 mG = totalGray / totalPixels # 平均灰度 icv = np.zeros(256) numFt, sumFt = 0, 0 for t in range(256): # 遍历灰度值 numFt += histCV[t,0] # F(t) 像素数量 sumFt += histCV[t,0] * t # F(t) 灰度值总和 pF = numFt / totalPixels # F(t) 像素数占比 mF = (sumFt/numFt) if numFt>0 else 0 # F(t) 平均灰度 numBt = totalPixels-numFt # B(t) 像素数量 sumBt = totalGray - sumFt # B(t) 灰度值总和 pB = numBt / totalPixels # B(t) 像素数占比 mB = (sumBt/numBt) if numBt>0 else 0 # B(t) 平均灰度 icv[t] = pF * (mF-mG)**2 + pB * (mB-mG)**2 # 灰度 t 的类间方差 maxIcv = max(icv) # ICV 的最大值 maxIndex = np.argmax(icv) # 最大值的索引 # 阈值处理 ret, imgBin = cv2.threshold(img, maxIndex, 255, cv2.THRESH_BINARY) # 以 maxIndex 作为最优阈值 ret, imgOtsu = cv2.threshold(img, mG, 255, cv2.THRESH_OTSU) # 阈值分割, OTSU print("t(maxICV)={}, retOtsu={}".format(maxIndex, round(ret))) plt.figure(figsize=(7,7)) plt.subplot(221), plt.axis('off'), plt.title("Origin"), plt.imshow(img, 'gray') plt.subplot(222, yticks=[]), plt.title("Gray Hist") # 直方图 plt.plot(scale, histCV[:,0]/max(histCV)) # 灰度直方图 plt.plot(scale, icv/maxIcv) # 类间方差图 plt.subplot(223), plt.title("global binary(T={})".format(maxIndex)), plt.axis('off') plt.imshow(imgBin, 'gray') plt.subplot(224), plt.title("OTSU binary(T={})".format(round(ret))), plt.axis('off') plt.imshow(imgOtsu, 'gray') plt.tight_layout() plt.show()
(本节完)
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124281291)
Copyright 2022 youcans, XUPT
Crated:2022-4-18
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中【youcans 的 OpenCV 例程200篇】158. 阈值处理之固定阈值法
【youcans 的 OpenCV 例程200篇】159. 图像分割之全局阈值处理
【youcans 的 OpenCV 例程200篇】160. 图像处理之OTSU 方法
【youcans 的 OpenCV 例程200篇】161. OTSU 阈值处理算法的实现
【youcans 的 OpenCV 例程200篇】162. 全局阈值处理改进方法
【youcans 的 OpenCV 例程200篇】163. 基于边缘信息改进全局阈值处理
【youcans 的 OpenCV 例程200篇】164.使用 Laplace 边缘信息改进全局阈值处理
【youcans 的 OpenCV 例程200篇】165.多阈值 OTSU 处理方法
【youcans 的 OpenCV 例程200篇】166.自适应阈值处理
【youcans 的 OpenCV 例程200篇】167.基于移动平均的可变阈值处理
更多内容,请见:
【OpenCV 例程200篇 总目录-202206更新】
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。