1 建模
A.读取图像:
1.使用imread函数读取图像文件。
2.如果图像是彩色的,通常需要先转换为灰度图像,因为大津阈值法通常应用于灰度图像。
B.灰度化:
1.如果图像是彩色的,使用rgb2gray函数将其转换为灰度图像。
2.灰度图像只包含亮度信息,便于后续处理。
D.阈值分割:
1.使用大津阈值法(Otsu's method)计算全局阈值。
2.graythresh函数可以自动计算这个阈值。
3.使用imbinarize或逻辑运算(例如gray_image > threshold)将灰度图像转换为二值图像。
E.连通区域标记:
1.使用bwlabel函数标记二值图像中的连通区域。
2.这个函数会为每个独立的连通区域分配一个唯一的标签。
F.统计连通区域数量:
1.bwlabel函数在返回标记图像的同时,也返回了连通区域的数量。
2.可以直接使用这个数量作为目标物体的计数。
G.可视化结果:
1.使用imshow函数显示原始图像、二值化图像和标记后的图像。
2.可以使用subplot函数将多个图像放在同一个窗口中显示。
3.可以使用label2rgb函数将标记图像转换为彩色图像,以便于观察不同的连通区域。
2 代码
function segment_and_label_image(image_path)
% 读取图像
original_image = imread(image_path);
if size(original_image, 3) == 3 % 如果是彩色图像,则转换为灰度图像
gray_image = rgb2gray(original_image);
else
gray_image = original_image;
end
% 使用大津阈值法计算阈值
threshold = graythresh(gray_image);
% 根据阈值对图像进行二值化处理
binary_image = imbinarize(gray_image, threshold);
% 标记连通区域
[labeled_image, num_objects] = bwlabel(binary_image);
% 显示原始图像
subplot(2, 2, 1);
imshow(original_image);
title('原始图像');
% 显示二值化图像
subplot(2, 2, 2);
imshow(binary_image);
title('二值化图像');
% 显示标记连通区域后的图像
subplot(2, 2, 3);
imshow(label2rgb(labeled_image, 'jet', 'k', 'shuffle'));
title(['连通区域标记,共检测到 ', num2str(num_objects), ' 个对象']);
% 等待用户按键,然后关闭所有图像窗口
pause;
close all;
end
segment_and_label_image('米粒.png'); % 替换为你的图像路径
3 运行结果
图1 图像目标计数结果