大津二值化python代码
时间: 2023-10-13 08:25:44 浏览: 118
以下是大津二值化的Python代码实现:
```python
import cv2
def otsu_threshold(img):
# 将图像转为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 计算灰度直方图
hist = cv2.calcHist([gray], [0], None, [256], [0, 256])
# 归一化直方图
hist_norm = hist.ravel() / hist.max()
# 初始化最大类间方差为0,最佳阈值为0
max_variance, best_threshold = 0, 0
# 计算总像素数
total_pixels = gray.shape[0] * gray.shape[1]
# 遍历灰度级,计算类间方差
for i in range(256):
# 计算背景像素占比
w0 = hist_norm[:i].sum()
# 计算前景像素占比
w1 = hist_norm[i:].sum()
# 计算背景像素平均灰度值
u0 = (hist_norm[:i] * np.arange(0, i)).sum() / (w0 + 1e-8)
# 计算前景像素平均灰度值
u1 = (hist_norm[i:] * np.arange(i, 256)).sum() / (w1 + 1e-8)
# 计算类间方差
variance = w0 * w1 * (u0 - u1) ** 2
# 更新最大类间方差和最佳阈值
if variance > max_variance:
max_variance = variance
best_threshold = i
# 对原图像进行二值化处理
ret, thresh = cv2.threshold(gray, best_threshold, 255, cv2.THRESH_BINARY)
return thresh
```
这段代码会将输入的图像转为灰度图像,然后计算灰度直方图,归一化直方图。接着,计算最佳阈值,然后对原图像进行二值化处理,并返回处理后的图像。
阅读全文