自动阈值大津法python代码
时间: 2023-06-25 12:04:00 浏览: 109
大津法(Otsu's Method)是一种图像处理中常用的二值化方法,可以通过统计图像灰度级别的分布来自动确定阈值,使得图像二值化后的目标物体与背景之间的差异最大化。下面是一个Python实现的大津法二值化代码:
``` python
import cv2
# 读入灰度图像
img = cv2.imread('your_image.jpg', 0)
# 计算图像直方图
hist, bins = np.histogram(img.flatten(), 256, [0, 256])
# 初始化最佳阈值和最大类间方差
best_threshold = 0
max_variance = 0
# 遍历所有可能的阈值
for threshold in range(256):
# 计算背景像素和前景像素的灰度平均值
background_mean = np.mean(hist[:threshold])
foreground_mean = np.mean(hist[threshold:])
# 计算背景像素和前景像素的权重
background_weight = np.sum(hist[:threshold]) / img.size
foreground_weight = np.sum(hist[threshold:]) / img.size
# 计算类间方差
variance = background_weight * foreground_weight * \
(background_mean - foreground_mean) ** 2
# 更新最佳阈值和最大类间方差
if variance > max_variance:
best_threshold = threshold
max_variance = variance
# 对图像进行二值化
binary_img = cv2.threshold(img, best_threshold, 255, cv2.THRESH_BINARY)[1]
# 显示结果
cv2.imshow('Original Image', img)
cv2.imshow('Binary Image', binary_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
其中,`cv2.imread()`函数用于读入灰度图像,`np.histogram()`函数用于计算图像直方图。在遍历所有可能的阈值时,需要计算背景像素和前景像素的灰度平均值和权重,然后根据公式计算类间方差。最终得到最佳阈值,并通过`cv2.threshold()`函数对图像进行二值化,最后将结果显示出来。
阅读全文