python otsu阈值分割算法
时间: 2024-01-24 08:16:05 浏览: 154
otsu1234.rar_分割算法_图像分割算法_图像分割算法 阈值
大津法(Otsu)是一种常用的图像阈值分割算法,用于将图像分成两个部分:前景和背景。它的原理是通过寻找使得前景和背景之间类间方差最大的阈值来实现分割。
以下是使用Python实现Otsu阈值分割算法的示例代码:
```python
import cv2
# 读取图像
image = cv2.imread('image.jpg', 0)
# 计算图像的直方图
hist = cv2.calcHist([image], [0], None, [256], [0, 256])
# 归一化直方图
hist_norm = hist.ravel() / hist.max()
# 计算累积分布函数
Q = hist_norm.cumsum()
# 计算类间方差
bins = np.arange(256)
fn_min = np.inf
thresh = -1
for i in range(1, 256):
p1, p2 = np.hsplit(hist_norm, [i]) # 概率
q1, q2 = Q[i], Q[255] - Q[i] # 累积概率
if q1 == 0:
q1 = 0.0001
if q2 == 0:
q2 = 0.0001
m1, m2 = np.sum(p1 * bins[:i]) / q1, np.sum(p2 * bins[i:]) / q2 # 均值
v1, v2 = np.sum(((bins[:i] - m1) ** 2) * p1) / q1, np.sum(((bins[i:] - m2) ** 2) * p2) / q2 # 方差
fn = v1 * q1 + v2 * q2 # 类间方差
if fn < fn_min:
fn_min = fn
thresh = i
# 应用阈值分割
binary_image = image > thresh
# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Binary Image', binary_image.astype(np.uint8) * 255)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
这段代码首先读取图像,然后计算图像的直方图并归一化。接下来,计算累积分布函数和类间方差。最后,根据找到的最佳阈值将图像进行二值化处理,并显示结果。
阅读全文