试编写程序统计图像灰度直方图,利用 Otsu 法对一幅图像进行分割,给出阈值和可分 性度量
时间: 2024-03-11 21:49:13 浏览: 238
以下是Matlab代码实现:
```matlab
img = imread('lena.jpg'); % 读取图像
gray_img = rgb2gray(img); % 转换为灰度图像
figure;imshow(gray_img);title('原始图像');
% 统计灰度直方图
[counts, bins] = imhist(gray_img);
figure;bar(bins, counts);title('灰度直方图');
% Otsu法求阈值
total = sum(counts);
sumB = 0;
wB = 0;
maximum = 0.0;
level = 0;
for i=1:256
wB = wB + counts(i);
if wB == 0
continue
end
wF = total - wB;
if wF == 0
break
end
sumB = sumB + i*counts(i);
mB = sumB / wB;
mF = (sum - sumB) / wF;
between = wB * wF * (mB - mF)^2;
if between >= maximum
level = i;
maximum = between;
end
end
% 二值化图像并显示
threshold_img = imbinarize(gray_img, level/255);
figure;imshow(threshold_img);title('Otsu法分割结果');
fprintf('Otsu阈值:%d\n', level);
fprintf('可分性度量:%f\n', maximum/(total^2));
```
该程序使用`imread`函数读取图像,`rgb2gray`函数将图像转换为灰度图像,`imhist`函数统计灰度直方图,`bar`函数绘制灰度直方图。然后使用Otsu法求出最佳阈值,并使用`imbinarize`函数对图像进行二值化处理。最后输出阈值和可分性度量。
阅读全文