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 图像目标计数结果