《数字图像处理与机器视觉》案例四 基于分水岭算法的粘连物体的分割与计数

news2024/11/17 18:26:36

一、引言

      分水岭算法(Watershed Algorithm),是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界则形成分水岭。分水岭的概念和形成可以通过模拟浸入过程来说明。在每一个局部极小值表面,刺穿一个小孔,然后把整个模型慢慢浸入水中,随着浸入的加深,每一个局部极小值的影响域慢慢向外扩展,在两个集水盆汇合处构筑大坝,即形成分水岭。 分水岭算法可以应用于分割粘连对象和对象计数。在该算法中,空间上相邻并且灰度值相近的像素被划分为一个区域。一般来讲,直接应用分水岭分割算法的效果往往并不好,如果在图像中对前景对象和背景对象进行标注区别,再应用分水岭算法会取得较好的分割效果。下面以具有粘连大米的分割计数为例,开发了基于MATLAB的分水岭算法大米颗粒的分割计数,算法主要步骤如下图所示。

二、程序代码

clear all;
close all;
clc;
%%步骤1 读图并进行背景处理
I0=imread('.\rice2.jpg');
I_r=I0(:,:,1);  % 提取R通道图像
I_g=I0(:,:,2);
I_b=I0(:,:,3);
I_rb=I_r-I_b;
figure,imhist(I_rb);%具有明显的双峰特性
I_bw=1-im2bw(I_rb,45/255);             %使用指定阈值分割
%I_bw=1-im2bw(I_rb,graythresh(I_rb));   %使用OTSU方法进行阈值分割并反色
%I_bw=1-imbinarize(I_rb,'adaptive');
figure,imshow(I_bw);
Obj1_r=uint8(I_bw).*I_r;
Obj1_g=uint8(I_bw).*I_g;
Obj1_b=uint8(I_bw).*I_b;
rgb=cat(3,Obj1_r,Obj1_g,Obj1_b);
figure,imshow(rgb);
%%步骤2 利用梯度实现灰度图像的分割
I = rgb2gray(rgb);
hy = fspecial('sobel');hx = hy';    %使用sobel算子进行边缘检测
Iy = imfilter(double(I), hy, 'replicate');
Ix = imfilter(double(I), hx, 'replicate');
gradmag = sqrt(Ix.^2 + Iy.^2);     %求模
%%步骤3 标记前景对象
se = strel('diamond',3);                  %构建结构元素
Io = imopen(I, se);                         %形态学开操作    
Ie = imerode(I, se);                        %腐蚀                       
Iobr = imreconstruct(Ie, I);             %重建
Ioc = imclose(Io, se);                     %形态学闭操作
Iobrd = imdilate(Iobr, se);               %膨胀
Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr));
Iobrcbr = imcomplement(Iobrcbr);  %求反
%%步骤4 获取局部最大值
fgm = imregionalmax(Iobrcbr);          %获得局部最大值
It1 = rgb(:, :, 1); It2 = rgb(:, :, 2);
It3 = rgb(:, :, 3);
It1(fgm) = 255; It2(fgm) = 0; It3(fgm) = 0;
I2 = cat(3, It1, It2, It3);
%%步骤5
se2 = strel(ones(3,3));             
fgm2 = imclose(fgm, se2);                    %闭操作
fgm3 = imerode(fgm2, se2);                 %腐蚀
fgm4 = bwareaopen(fgm3, 20);            %删除
It1 = rgb(:, :, 1);
It2 = rgb(:, :, 2);
It3 = rgb(:, :, 3);
It1(fgm4) = 255;                                     %前景设置为255
It2(fgm4) = 0;
It3(fgm4) = 0;
I3 = cat(3, It1, It2, It3);
%%步骤6 标记背景
bw = im2bw(Iobrcbr, graythresh(Iobrcbr));          %二值转换
D = bwdist(bw);                                                   %计算距离
DL = watershed(D);                                             %分水岭变换
bgm = DL == 0;                         
gradmag2 = imimposemin(gradmag, bgm | fgm4);     %置最小值
L = watershed(gradmag2);
It1 = rgb(:, :, 1);
It2 = rgb(:, :, 2);
It3 = rgb(:, :, 3);
fgm5 = imdilate(L == 0, ones(9, 2)) | bgm | fgm4;   %前景及边界处置255
It1(fgm5) = 255; It2(fgm5) = 0; It3(fgm5) = 0;
I4 = cat(3, It1, It2, It3);
figure,imshow(I4);
%%步骤7 去粘连、填孔、分割
figure('units', 'normalized', 'position', [0 0 1 1]);
P=rgb2gray(I4);                                 % 彩色图像转灰度
figure,imshow(P);
figure,imhist(P);              %具有明显的双峰特性
P1=im2bw(P,200/255);                      % 灰度图像二值化
SE1=strel('square',3);
P2=imopen(P1,SE1);                        % 以SE为单位对P1进行开运算
SE2=strel('square',2);                       % 构造半径为2圆形元素
P3=imerode(P2,SE2);             % 形态学腐蚀运算,部分目標物有粘连现象,去除粘连
P4 = imfill(P3,'hole');
SE3=strel('square',2);
P5=imopen(P4,SE3);                        % 以SE3作开运算
SE4=strel('disk',3);
%SE4=strel('disk',5);
P6=imerode(P5,SE4);                       %形态学腐蚀运算,进一步去除粘连
P7 = bwareaopen (P6, 100);
figure,imshow(P7);
%%步骤8 计算连通数,输出结果
[L,N]=bwlabel(P7,8);            % 计算连通数,N即为目标个数
figure,imshow(I0);
hold on
for k=1:N
[r,c] = find(L == k);
rbar = mean(r);
cbar = mean(c);
plot(cbar,rbar,'marker','+','markeredgecolor','b','markersize',6); % 对话框显示目标物个数,通过坐标定点,标记点为“+”
end    
title(['大米总数为',num2str(N)],'Fontsize',14)
figure,
subplot(1,3,1),imshow(I0),title('存在粘连的大米彩色图像');
subplot(1,3,2),imshow(I4),title('分水岭算法分割图像');
subplot(1,3,3),imshow(P7),title('数学形态学运算后的图像');

三、程序运行结果

四、原始图像

五、讨论

        由运行结果可知,使用分水岭算法可以对存在粘连大米图像取得较好的分割效果和计数,对其它粘连物体的分割和计数也具有一定参考价值。但也发现有存在粘连严重的两个大米被误算为1个。

        如果觉得本案例对大家今后的编程有帮助,还请点赞、收藏。如有改进意见可以与我联系,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1891825.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python123题库】#判断闰年 #判断奇偶数 #分段函数A

禁止转载,原文:https://blog.csdn.net/qq_45801887/article/details/140079827 参考教程:B站视频讲解——https://space.bilibili.com/3546616042621301 有帮助麻烦点个赞 ~ ~ Python123题库 判断闰年判断奇偶数分段函数A 判断闰年 类型&am…

静态方法与实例方法的区别

静态方法与实例方法的区别 1、静态方法(Static Methods)1.1 调用方式1.2 访问权限 2、实例方法(Instance Methods)2.1 调用方式2.2 访问权限 3、总结 💖The Begin💖点点关注,收藏不迷路&#x1…

DDR3(一)

目录 1 SDRAM1.1 同步动态随机存储器1.2 位宽1.3 SDRAM结构1.4 SDRAM引脚图 2 SDRAM操作指令2.1 读写指令2.2 刷新和预充电2.3 配置模式寄存器2.4 读/写突发2.5 数据屏蔽 SDRAM是DDR3的基础,在学习DDR3之前,我们先来学习一下SDRAM的相关知识。 1 SDRAM …

Spring容器生命周期中如前置运行程序和后置运行程序

在Spring容器加入一个实现了BeanPostProcessor接口bean实例,重写postProcessBeforeInitialization、postProcessAfterInitialization方法,在方法里面写具体的实现,从而达到Spring容器在初如化前或销毁时执行预定的程序,方法如下&a…

浅谈 Linux 中的 core dump 分析方法

文章目录 一、什么是 core dump二、发生 core dump 的原因1. 空指针或非法指针引起 core dump2. 数组越界或指针越界引起的 core dump3. 数据竞争导致 core dump4. 代码不规范 三、core dump 分析方法1. 启用 core dump2. 触发 core dump2-1. 因空指针解引用而崩溃2-2. 通过 SI…

S272钡铼技术4G无线RTU支持多路DIN输入和模拟量转换至4G网络

钡铼第四代RTU S272是一款先进的工业级4G远程遥测终端,为各种远程工业数据采集和控制系统提供了高效解决方案。结合了现代通信技术和多功能的输入输出接口,S272不仅支持多路数字量和模拟量输入,还具备灵活的扩展性和强大的控制功能&#xff0…

如何利用小猪APP分发轻松将网页封装成APP

什么是网页封装APP? 假设你有一个非常棒的网站,但你希望用户能更方便地在手机上访问它。你可能会考虑将该网页封装成一个APP。封装APP其实就是将网页内容打包成一个移动应用,这样用户可以像使用其他APP一样方便地使用你的服务。 APP分发www…

大华设备接入GB28181/GAT1400视频汇聚管理平台EasyCVR安防监控系统的具体操作步骤

智慧城市/视频汇聚/安防监控平台EasyCVR兼容性强,支持多协议接入,包括国标GB/T 28181协议、GA/T 1400协议、部标JT808协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SDK等,并能对外分发RTMP、…

动物检测yolo格式数据集(水牛 、大象 、犀牛 、斑马四类)

动物检测数据集 1、下载地址: https://download.csdn.net/download/qq_15060477/89512588?spm1001.2101.3001.9500 2、数据集介绍 本数据集含有四种动物可以检测,分别是水牛 、大象 、犀牛 、斑马四类,数据集格式为yolo格式,…

java进行音视频的拆分和拼接

一、下载ffmpeg并安装 官网地址https://ffmpeg.org/download.html 载后解压缩如下 D:\google-download\ffmpeg-2024-01-28-git-e0da916b8f-essentials_build\bin>ls ffmpeg.exe ffplay.exe ffprobe.exe 展示三个exe可执行文件 配置环境变量 配置后直接在cmd输入ffmpeg…

首家!腾讯云数据万象通过中国信通院智能存储专项测试

2024年6月19日,由中国通信标准化协会主办,中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)承办的首届“数据智能大会”在京隆重召开。腾讯云存储受邀出席了活动,大会中“可信数据智能”系列评估测试结果正式颁布,经过严苛…

AI是在帮助开发者还是取代他们?

一:介绍 生成式人工智能(AIGC)在软件开发领域的应用确实为开发者带来了很多便利和效率提升。AI工具可以通过代码生成、错误检测、自动化测试等功能,帮助开发者更快速地开发和优化软件,减少重复性工作,提高…

商标的近似分辩,商标起名称时注意!

曾有过网友发来商标名称,普推知商标老杨说有近似,然后网友起过新名称还是存有近似,或者加字,后面加的通用词,与先有商标名称也是近似。 “良信健康”这个名称健康是行业通用词,加成健康后变成四个字&#x…

C++ 语法

一、头文件与源文件 头文件用于声明函数,类似于java中service层的接口; 源文件用于实现头文件函数,相当于java中serviceImpl层的实现类; 定义接口 实现接口 使用接口 二、指针概述 定义与使用 定义一个指针p用于存a变量的内存地址,即指针就是地址; 解引用可以获取或修改…

【C++】 解决 C++ 语言报错:Double Free or Corruption

文章目录 引言 双重释放或内存破坏(Double Free or Corruption)是 C 编程中常见且严重的内存管理问题。当程序尝试多次释放同一块内存或对已经释放的内存进行操作时,就会导致双重释放或内存破坏错误。这种错误不仅会导致程序崩溃&#xff0c…

提升Android Studio开发体验:使用Kelp插件实现颜色和图标预览

提升Android Studio开发体验:使用Kelp插件实现颜色和图标预览 在Android开发中,自动补全功能对于提高开发效率至关重要。然而,默认的Android Studio并不能预览颜色和图标,这使得开发者在选择资源时常常感到困惑。本文将介绍如何使…

sql优化-单表优化

文章目录 0、索引优化原则1、在docker内部连接mysql2、数据准备3、创建表 dept 和 emp4、插入50万数据到 emp 表中4.1、创建函数4.2、存储过程4.3、调用存储过程 5、查找姓名以"abc"开头的员工信息5.1、执行计划 select * from emp where name like abc%;5.2、sql优化…

容器部署rabbitmq集群迁移

1、场景: 因业务需要,要求把rabbitmq-A集群上的数据迁移到rabbitmq-B集群上,rabbitmq的数据包括元数据(RabbitMQ用户、vhost、队列、交换和绑定)和消息数据,而消息数据存储在单独的消息存储库中。 2、迁移要…

大模型备案全网最详细流程【附附件】

本文要点:大模型备案最详细说明,大模型备案条件有哪些,《算法安全自评估报告》模板,大模型算法备案,大模型上线备案,生成式人工智能(大语言模型)安全评估要点,网信办大模型备案。 大模型备案安…