写一段用OTSU算法将图像二值化的MATLAB程序,要求数组大小兼容,避免对非标量进行求幂的错误
时间: 2024-03-22 15:38:22 浏览: 63
基于OTSU 算法进行图片的二值化 完整代码和实验报告
5星 · 资源好评率100%
好的,以下是用OTSU算法将图像二值化的MATLAB程序:
```
% 读入图像
img = imread('example.jpg');
% 将图像转换为灰度图像
gray_img = rgb2gray(img);
% 计算灰度图像的直方图
histogram = imhist(gray_img);
% 计算图像像素总数
total_pixels = numel(gray_img);
% 遍历灰度级别,计算类间方差
max_var = 0;
threshold = 0;
for i = 1:256
% 计算背景像素数量
bg_pixels = sum(histogram(1:i));
% 计算前景像素数量
fg_pixels = total_pixels - bg_pixels;
% 如果背景像素数量为0,则跳过本次循环
if bg_pixels == 0
continue;
end
% 如果前景像素数量为0,则退出循环
if fg_pixels == 0
break;
end
% 计算背景平均灰度值
bg_mean = sum((0:i-1) .* histogram(1:i)) / bg_pixels;
% 计算前景平均灰度值
fg_mean = sum((i:255) .* histogram(i+1:end)) / fg_pixels;
% 计算类间方差
var_between = bg_pixels * fg_pixels * ((bg_mean - fg_mean) / 255) ^ 2;
% 更新阈值和最大类间方差
if var_between > max_var
max_var = var_between;
threshold = i - 1;
end
end
% 用OTSU算法得到的阈值对图像进行二值化处理
binary_img = imbinarize(gray_img, threshold/255);
% 显示原图和二值化后的图像
subplot(1, 2, 1), imshow(gray_img), title('原图');
subplot(1, 2, 2), imshow(binary_img), title('二值化后的图像');
```
这段程序使用OTSU算法计算阈值,并将图像二值化。为了避免对非标量进行求幂的错误,计算类间方差时将背景平均灰度值和前景平均灰度值除以255。
阅读全文