Python:最大类间方差法OTSU算法的实现及完整源码 您所在的位置:网站首页 怎么用excel计算方差 Python:最大类间方差法OTSU算法的实现及完整源码

Python:最大类间方差法OTSU算法的实现及完整源码

2023-06-14 01:03| 来源: 网络整理| 查看: 265

Python:最大类间方差法OTSU算法的实现及完整源码

OTSU算法是一种用于图像处理中二值化的自适应阈值算法。其核心思想是基于图像灰度直方图找到最优阈值,将图像二值化从而实现目标检测、分割等任务。本文将介绍如何使用Python实现OTSU算法,并提供完整源码。

首先,我们需要导入必要的库。在本例中,我们需要使用NumPy、opencv-python和matplotlib这三个库。

import numpy as np import cv2 import matplotlib.pyplot as plt

接下来,我们读取图像并转换为灰度图像。

img = cv2.imread('lena.png') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

然后,我们可以计算图像的灰度直方图。

hist = cv2.calcHist([gray],[0],None,[256],[0,256])

接下来,我们需要实现OTSU算法的关键部分。OTUS算法的核心是找到最优阈值,使得阈值左右两侧的类间方差最大。我们可以通过以下代码实现:

def otsu(hist): total = np.sum(hist) # 计算灰度直方图所有像素点的个数 max_variance = 0 threshold = 0 sum_back = 0 class_back = 0 sum_fore = np.sum(np.arange(256) * hist) # 计算前景像素点总灰度值 for i in range(256): class_back += hist[i] # 将像素点逐个划分到前景和背景中 if class_back == 0: # 防止除数为零的情况 continue class_fore = total - class_back if class_fore == 0: # 防止除数为零的情况 break sum_back += i * hist[i] mean_back = sum_back / class_back # 计算背景的平均灰度 mean_fore = (sum_fore - sum_back) / class_fore # 计算前景的平均灰度 var_between = class_back * class_fore * ((mean_back - mean_fore) / total) ** 2 # 计算类间方差 if var_between > max_variance: max_variance = var_between threshold = i return threshold

最后,我们可以将二值化图像与原图像一起展示出来。

threshold = otsu(hist) print('阈值:', threshold) _, binary = cv2.threshold(gray, threshold, 255, cv2.THRESH_BINARY) plt.subplot(121) plt.imshow(img[:,:,::-1]) plt.title('Original Image') plt.xticks([]) plt.yticks([]) plt.subplot(122) plt.imshow(binary, cmap='gray') plt.title('OTSU Image') plt.xticks([]) plt.yticks([]) plt.show()

完整代码如下:

import numpy as np import cv2 import matplotlib.pyplot as plt def otsu(hist): total = np.sum(hist) # 计算灰度直方图所有像素点的个数 max_variance = 0 threshold = 0 sum_back = 0 class_back = 0 sum_fore = np.sum(np.arange(256) * hist) # 计算前景像素点总灰度值 for i in range(256): class_back += hist[i] # 将像素点逐个划分到前景和背景中 if class_back == 0: # 防止除数为零的情况 continue class_fore = total - class_back if class_fore == 0: # 防止除数为零的情况 break sum_back += i * hist[i] mean_back = sum_back / class_back # 计算背景的平均灰度 mean_fore = (sum_fore - sum_back) / class_fore # 计算前景的平均灰度 var_between = class_back * class_fore * ((mean_back - mean_fore) / total) ** 2 # 计算类间方差 if var_between > max_variance: max_variance = var_between threshold = i return threshold img = cv2.imread('lena.png') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) hist = cv2.calcHist([gray],[0],None,[256],[0,256]) threshold = otsu(hist) print('阈值:', threshold) _, binary = cv2.threshold(gray, threshold, 255, cv2.THRESH_BINARY) plt.subplot(121) plt.imshow(img[:,:,::-1]) plt.title('Original Image') plt.xticks([]) plt.yticks([]) plt.subplot(122) plt.imshow(binary, cmap='gray') plt.title('OTSU Image') plt.xticks([]) plt.yticks([]) plt.show()

通过本文,我们学习了如何使用Python实现OTSU算法,并使用matplotlib库将二值化图像与原图像一起展示出来。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有