生成一个Otsu 阈值分割算法的python案例
时间: 2023-12-23 21:46:55 浏览: 80
以下是一个Otsu阈值分割算法的Python案例,用于将灰度图像转换为二进制图像。
```python
import cv2
import numpy as np
def otsu_threshold(img):
# 计算图像灰度直方图
hist, bins = np.histogram(img.ravel(), 256, [0, 256])
# 归一化直方图
hist_norm = hist.astype('float') / img.size
# 计算累计直方图
cum_sum = np.cumsum(hist_norm)
# 计算图像灰度均值
mean_val = np.mean(img)
# 初始化最大类间方差和阈值
max_var = 0
threshold = 0
# 遍历所有可能的阈值
for i in range(1, 256):
# 计算类别1的权重、均值和方差
w1 = cum_sum[i]
mean1 = np.sum(np.arange(1, i+1) * hist_norm[:i]) / w1
var1 = np.sum(((np.arange(1, i+1) - mean1) ** 2) * hist_norm[:i]) / w1
# 计算类别2的权重、均值和方差
w2 = 1 - w1
mean2 = np.sum(np.arange(i+1, 256) * hist_norm[i:]) / w2
var2 = np.sum(((np.arange(i+1, 256) - mean2) ** 2) * hist_norm[i:]) / w2
# 计算类间方差
inter_var = w1 * w2 * (mean1 - mean2) ** 2
# 更新最大类间方差和阈值
if inter_var > max_var:
max_var = inter_var
threshold = i
# 二值化图像
img_binary = cv2.threshold(img, threshold, 255, cv2.THRESH_BINARY)[1]
return img_binary
# 读取灰度图像
img_gray = cv2.imread('test.jpg', cv2.IMREAD_GRAYSCALE)
# 进行Otsu阈值分割
img_binary = otsu_threshold(img_gray)
# 显示原图和二值化图像
cv2.imshow('Gray Image', img_gray)
cv2.imshow('Binary Image', img_binary)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
该代码将读取名为“test.jpg”的灰度图像,并将其传递给`otsu_threshold`函数,该函数将返回二值化图像。最后,显示原始灰度图像和二值化图像。
阅读全文