C++利用OpenCV实现大津法
时间: 2024-01-10 14:46:22 浏览: 91
大津法(Otsu's Method)是一种图像二值化方法,可以将灰度图像转换为黑白二值图像。该方法的基本思想是在图像的灰度直方图中寻找一个阈值,使得在该阈值下方的灰度值分为一个类别,该阈值上方的灰度值分为另一个类别,使得两个类别之间的类内方差最小,类间方差最大。
下面是利用OpenCV实现大津法的代码:
```python
import cv2
# 读取灰度图像
img = cv2.imread('test.jpg', cv2.IMREAD_GRAYSCALE)
# 计算灰度直方图
hist = cv2.calcHist([img], [0], None, [256], [0, 256])
# 计算总像素数
total_pixels = img.shape[0] * img.shape[1]
# 初始化最大类间方差和阈值
max_variance = 0
threshold = 0
# 遍历灰度级
for i in range(256):
# 计算当前阈值下的类内方差和类间方差
w0 = sum(hist[:i]) / total_pixels
w1 = sum(hist[i:]) / total_pixels
u0 = sum([j * hist[j] for j in range(i)]) / (total_pixels * w0) if w0 != 0 else 0
u1 = sum([j * hist[j] for j in range(i, 256)]) / (total_pixels * w1) if w1 != 0 else 0
variance = w0 * w1 * (u0 - u1) ** 2
# 更新最大类间方差和阈值
if variance > max_variance:
max_variance = variance
threshold = i
# 对原图像进行二值化处理
binary_img = cv2.threshold(img, threshold, 255, cv2.THRESH_BINARY)[1]
# 显示原图像和二值化图像
cv2.imshow('Original Image', img)
cv2.imshow('Binary Image', binary_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在代码中,首先读取灰度图像,并计算其灰度直方图。然后遍历灰度级,计算当前阈值下的类内方差和类间方差,更新最大类间方差和阈值。最后使用cv2.threshold()函数对原图像进行二值化处理,并显示原图像和二值化图像。
运行代码后,可以看到原图像和经过大津法二值化处理后的图像,如下图所示:
![原图像和二值化图像](https://img-blog.csdn.net/20180319223908215?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmxvZzIwMTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80)
阅读全文