基于大津阈值法和二值化与联通区域标记进行图像目标计数

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 运行结果

cf53fcece996466dbad21f2447af0991.png

图1 图像目标计数结果

 

 

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值