有没有更加精细的图像二值化代码
时间: 2024-04-14 10:10:42 浏览: 82
当涉及到图像二值化时,有很多种算法可以使用,因此有许多不同的代码实现。这里提供一个比较通用的二值化代码,它使用 Otsu's thresholding 算法。
```python
import numpy as np
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.sum()
# 初始化参数
omega = np.zeros(256)
mu = np.zeros(256)
# 计算 omega 和 mu
for i in range(1,256):
omega[i] = omega[i-1] + hist_norm[i]
mu[i] = mu[i-1] + i*hist_norm[i]
# 计算全局均值
global_mu = mu[-1]
# 计算类间方差
inter_var = np.zeros(256)
for i in range(1,256):
inter_var[i] = (global_mu*omega[i] - mu[i])**2 / (omega[i]*(1-omega[i]))
# 找到最大的类间方差对应的阈值
threshold = np.argmax(inter_var)
# 应用阈值
binary = cv2.threshold(gray, threshold, 255, cv2.THRESH_BINARY)[1]
return binary
```
该代码的主要思想是计算灰度图像的直方图,然后将其标准化。接下来,计算全局均值和类间方差,最终找到最大类间方差对应的阈值。最后,使用 OpenCV 的 `threshold` 函数将图像二值化。
阅读全文