今标 网站建设,网站主机选择,外贸进出口代理公司,什么网站程序好欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列#xff0c;持续更新中 OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】160. 图像处理之OTSU 方法 3.3 全局阈值处理 Otsu 方法
阈值处理本质上是对像素进行分类的统计决策问题。
OTSU 方法又称大津算… 欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列持续更新中 OpenCV 例程200篇 总目录-202205更新 【youcans 的 OpenCV 例程200篇】160. 图像处理之OTSU 方法 3.3 全局阈值处理 Otsu 方法
阈值处理本质上是对像素进行分类的统计决策问题。
OTSU 方法又称大津算法使用最大化类间方差intra-class variance作为评价准则基于对图像直方图的计算可以给出类间最优分离的最优阈值。
任取一个灰度值 T可以将图像分割为两个集合 F 和 B集合 F、B 的像素数的占比分别为 pF、pB集合 F、B 的灰度值均值分别为 mF、mB图像灰度值为 m定义类间方差为 ICVpF∗(mF−m)2pB∗(mB−m)2ICV p_F * (m_F - m)^2 p_B * (m_B - m)^2 ICVpF∗(mF−m)2pB∗(mB−m)2 使类间方差 ICV 最大化的灰度值 T 就是最优阈值。
因此只要遍历所有的灰度值就可以得到使 ICV 最大的最优阈值 T。
OpenCV 提供了函数 cv.threshold 可以对图像进行阈值处理将参数 type 设为 cv.THRESH_OTSU就可以使用使用 OTSU 算法进行最优阈值分割。 例程 11.17OTSU 最优全局阈值处理 # 11.17 OTSU 最优全局阈值处理img cv2.imread(../images/Fig1039a.tif, flags0)deltaT 1 # 预定义值histCV cv2.calcHist([img], [0], None, [256], [0, 256]) # 灰度直方图grayScale range(256) # 灰度级 [0,255]totalPixels img.shape[0] * img.shape[1] # 像素总数totalGray np.dot(histCV[:,0], grayScale) # 内积, 总和灰度值T round(totalGray/totalPixels) # 平均灰度while True:numC1, sumC1 0, 0for i in range(T): # 计算 C1: (0,T) 平均灰度numC1 histCV[i,0] # C1 像素数量sumC1 histCV[i,0] * i # C1 灰度值总和numC2, sumC2 (totalPixels-numC1), (totalGray-sumC1) # C2 像素数量, 灰度值总和T1 round(sumC1/numC1) # C1 平均灰度T2 round(sumC2/numC2) # C2 平均灰度Tnew round((T1T2)/2) # 计算新的阈值print(T{}, m1{}, m2{}, Tnew{}.format(T, T1, T2, Tnew))if abs(T-Tnew) deltaT: # 等价于 TTnewbreakelse:T Tnew# 阈值处理ret1, imgBin cv2.threshold(img, T, 255, cv2.THRESH_BINARY) # 阈值分割, threshTret2, imgOtsu cv2.threshold(img, T, 255, cv2.THRESH_OTSU) # 阈值分割, threshTprint(ret1, ret2)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) # 直方图histNP, bins np.histogram(img.flatten(), bins255, range[0, 255], densityTrue)plt.bar(bins[:-1], histNP[:])plt.subplot(223), plt.title(global binary(T{}).format(T)), plt.axis(off)plt.imshow(imgBin, gray)plt.subplot(224), plt.title(OTSU binary(T{}).format(round(ret2))), plt.axis(off)plt.imshow(imgOtsu, gray)plt.tight_layout()plt.show()本节完 版权声明
youcansxupt 原创作品转载必须标注原文链接(https://blog.csdn.net/youcans/article/details/124281210)
Copyright 2022 youcans, XUPT Crated2022-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更新】