otsu阈值分割算法matlab
时间: 2023-09-05 11:08:37 浏览: 105
Otsu阈值分割算法是一种经典的图像分割算法,可以根据图像的灰度值分布自动确定最佳的二值化阈值。下面是在MATLAB中实现Otsu阈值分割算法的示例代码:
```matlab
% 读取图像
img = imread('lena.png');
% 将图像转为灰度图
gray_img = rgb2gray(img);
% 计算灰度直方图
hist = imhist(gray_img);
% 计算像素总数
total_pixels = numel(gray_img);
% 初始化最大方差和最佳阈值
max_variance = 0;
best_threshold = 0;
% 遍历灰度级别
for t = 1:256
% 计算类间方差
w0 = sum(hist(1:t));
w1 = sum(hist(t+1:end));
if w0 == 0 || w1 == 0
continue;
end
m0 = sum((0:t-1)' .* hist(1:t)) / w0;
m1 = sum((t:255)' .* hist(t+1:end)) / w1;
variance = w0 * w1 * (m0 - m1)^2;
% 更新最大方差和最佳阈值
if variance > max_variance
max_variance = variance;
best_threshold = t - 1;
end
end
% 二值化图像
binary_img = gray_img > best_threshold;
% 显示原图和分割结果
subplot(1,2,1);
imshow(gray_img);
title('原图');
subplot(1,2,2);
imshow(binary_img);
title(['Otsu阈值分割结果,阈值为', num2str(best_threshold)]);
```
在上面的示例代码中,首先读取图像并将其转为灰度图,然后计算灰度直方图,接着遍历所有可能的阈值,计算每个阈值下的类间方差,并找到最大方差对应的阈值作为最佳阈值。最后根据最佳阈值对图像进行二值化并显示原图和分割结果。
阅读全文