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

一、引言

      分水岭算法(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.mfbz.cn/a/769564.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

少儿编程 2024年6月电子学会图形化编程等级考试Scratch一级真题解析(选择题)

2024年6月scratch编程等级考试一级真题 选择题(共25题,每题2分,共50分) 1、音乐Video Game1的时长将近8秒,点击一次角色,下列哪个程序不能完整地播放音乐两次 A、 B、 C、 D、 答案:D 考…

Socket编程用到的函数TCP UDP实例

最基本的 Socket 模型 参考这次答应我,一举拿下 I/O 多路复用! (qq.com) Socket编程详解-CSDN博客 Socket是一种通信机制,通过它可以在不同主机之间进行数据交换。在Socket编程中,有两种常见的通信模式:客户端-服务…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于目标鲁棒的电动汽车及基站储能联合参与电力市场的决策模型 》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Go语言--递归函数

递归函数 递归指所数可以直接或问接的调用自身。递归函数通常有相同的结构:一个跳出条件和一个递归体。所谓跳出条件就是根据传入的参数判断是否需要停止递归,而递归体则是函数自身所做的一些处理。 普通函数的调用流程 递归函数调用流程 一定要写终止条件。 实现…

【C++】初步认识C++

1. 初识C1.1 C概念相关1.2 C发展史及其重要性1.2.1 发展史1.2.2 重要性 2. C关键字3. 命名空间4. 输入和输出 个人主页:C_GUIQU 归属专栏:【C学习】 1. 初识C 1.1 C概念相关 C语言是结构化和模块化的语言,适合处理较小规模的程序。 【来源】…

Unity游戏帧率查看软件Fraps

Download Fraps 3.5.99 free version 下载、安装、运行这个软件,左上角就会自动显示帧率

跑腿平台小程序的设计

管理员账户功能包括:系统首页,个人中心,基础数据管理,管理员管理,接单详情管理,跑腿员管理,跑腿任务管理 微信端账号功能包括:系统首页,跑腿任务,接单员&…

windows上安装Frida环境

python安装 下载地址 Python Release Python 3.12.4 | Python.org python安装好后,使用如下命令安装frida客户端 pip install frida-tools 使用frida --version 查看frida版本 安装手机模拟器(雷电模拟器) 我的版本是4.0.61 查看CPU架构 adb …

SpringCloud进阶篇

文章目录 网关快速入门创建模块引入依赖修改启动类配置路由路由过滤(一般不用) 自定义GlobalFilter登录校验登录校验过滤器 微服务获取用户信息保存用户信息到请求头拦截器获取用户信息 OpenFeign传递用户信息配置共享添加共享配置拉取共享配置 配置热更新添加配置到Nacos配置热…

从零开始的python学习生活

第一天 pycharm部分好用快捷键 变量名的定义 与之前学习过的语言有所不同的是,python中变量名的定义更加的简洁 such as 整形。浮点型和字符串的定义 money50 haha13.14 gaga"hello"字符串的定义依然是需要加上引号,也不需要写;…

【docker】运行阶段遇到的问题

目录 1、查询docker 下挂载了哪些工具 2、docker中的简单命令 3、实际场景应用(redis) 目前工作中仅用到了redis,所以没有太多经验可以交流,暂时仅将我目前遇到的进行发布。还请见谅。 1、查询docker 下挂载了哪些工具 docker ps -a 或者…

新能源行业知识体系-------主目录-----持续更新

本文相当于目录方便快速检索内容,没有实际内容,只做索引 文章目录 一、电力市场概论二、蒙西电网需求侧响应三、蒙西电网市场结算V2.0三、2024内蒙古电力多边交易市场中长期交易相关事宜通知(讨论稿) 一、电力市场概论 是学习清华…

【区块链+基础设施】蜀信链 | FISCO BCOS应用案例

蜀信链是在四川省经济和信息化厅指导下,在四川省区块链行业协会组织下,由全省区块链相关从业与应用机构 共同参与建设和运营的区域性区块链基础设施,通过多方协同,共同打造合作共赢的区块链产业生态。 蜀信链区块链服务生态秉承“…

金融科技企业的数据治理与合规挑战

随着科技的发展,金融科技行业在我国得到了迅猛发展。金融科技创新不仅为消费者带来了便捷的金融服务,也极大地提高了金融行业的运营效率。然而,在金融科技发展的同时,数据治理与合规挑战也日益显现。本文将深入探讨金融科技企业在…

python如何安装各种库(保姆级教程)

使用Python爬虫时需要安装各种依赖库。安装一共有四种方法: 一、使用pip命令在线安装 二、在pycharm中在线安装 三、使用库的安装包本地安装 四、安装anaconda—anaconda中包含一般使用的所有库 一:pip安装 此步骤需要提前安装好python环境和pip。…

学习笔记——动态路由——OSPF(邻接/邻居)

十、OSPF的邻接/邻居 1、OSPF路由器之间的关系 (1)基本介绍 在OSPF网络中,为了交换链路状态信息和路由信息,邻居设备之间首先要建立邻接关系,邻居(Neighbors)关系和邻接(Adjacencies)关系是两个不同的概念。 OSPF路由器的两种关系&#x…

大模型概述-定义/分类/训练/应用

大模型概述 随着时代的发展, 大模型各个领域的应用正在不断扩大. 本文尽力梳理各种材料, 将从概念定义, 类型分类, 训练以及应用等方面对大模型进行一个简要的概述. 如果你想了解大模型但是却缺乏基础的知识或者觉得无从下手, 那么阅读该文章可能对你有所帮助. 如果想了解更多…

linux深度deepin基于rsync和apt-mirror同步软件源及构建本地内网源

目录 一、rsync方式二、apt-mirror方式1.安装apt-mirror2.配置apt-mirror(/etc/apt/mirror.list)3.新建存放目录开始下载 3.发布mirror站点 一、rsync方式 参考官方文档地址: https://www.deepin.org/index/docs/wiki/05_HOW-TO/08_%E9%95%9C%E5%83%8F%E5%8A%A0%E9%…

机器学习原理之 -- 最近邻算法分类:由来及原理详解

最近邻算法(k-Nearest Neighbors,k-NN)是一种简单且直观的分类算法,广泛应用于分类和回归问题。由于其易于理解和实现,k-NN在数据挖掘、模式识别和机器学习领域中占据重要地位。本文将详细介绍最近邻算法的由来、基本原…

LabVIEW干涉仪测向系统

开发了一套基于LabVIEW的软件系统,结合硬件设备,构建一个干涉仪测向实验教学平台。该平台应用于信号处理课程,帮助学生将理论知识与实际应用相结合,深化对信号处理核心概念的理解和应用。 项目背景: 当前信号处理教学…
最新文章