显示图像的直方图,根据图像的直方图中图像的灰度分布,选择最佳阈值,实现图像的二值化的 matlab
时间: 2023-12-10 16:38:07 浏览: 73
使用matlab输出灰度图像的直方图以及对图象的均衡化
5星 · 资源好评率100%
可以使用 Matlab 中的 `imhist` 函数来计算图像的直方图,然后根据直方图选择最佳阈值进行二值化。
以下是一个示例代码:
```matlab
% 读取图像
img = imread('example.jpg');
% 计算图像直方图
hist = imhist(img);
% 绘制直方图
figure;
bar(hist);
% 找到最大值和最小值
min_val = 0;
max_val = 255;
for i = 1:256
if hist(i) > 0
min_val = i;
break;
end
end
for i = 256:-1:1
if hist(i) > 0
max_val = i;
break;
end
end
% 使用 Otsu 方法选择最佳阈值
variances = zeros(256, 1);
for i = min_val:max_val
p1 = sum(hist(min_val:i)) / sum(hist);
p2 = sum(hist(i+1:max_val)) / sum(hist);
m1 = sum((min_val:i) .* hist(min_val:i)) / sum(hist(min_val:i));
m2 = sum((i+1:max_val) .* hist(i+1:max_val)) / sum(hist(i+1:max_val));
variances(i) = p1 * p2 * (m1 - m2)^2;
end
[~, thresh] = max(variances);
thresh = thresh - 1; % 将索引转换为阈值
% 对图像进行二值化
binary = imbinarize(img, thresh/255);
% 显示结果
figure;
subplot(1, 2, 1);
imshow(img);
title('原始图像');
subplot(1, 2, 2);
imshow(binary);
title(['阈值为 ', num2str(thresh)]);
```
在上述代码中,我们首先使用 `imhist` 函数计算图像直方图,并使用 `bar` 函数绘制直方图。然后,我们找到直方图中的最大值和最小值,将它们作为 Otsu 方法中的搜索范围。接下来,我们使用 Otsu 方法选择最佳阈值,并使用 `imbinarize` 函数对图像进行二值化。最后,我们使用 `imshow` 函数显示原始图像和二值化结果。
阅读全文