针对重叠的图像分割是非常具有挑战的,正好之前一起工作过的同事跟我一起讨论了关于这方面的问题,我首先想到的就是用分水岭来进行分割。

下面我将结合他提供的细胞图像来实现分水岭分割算法的实现。

1、RGB2HSV空间变换

首先我们观察图像可以看到背景是白色,而我们期望的目标颜色有深有浅,而且颜色也不一样,所以直接将RGB转成HSV,分割出白色区域然后再取反即可。关于白色在HSV中范围,我之前的文章中有分享过,这里就不给出来了。代码实现:

cv::Mat hsvimage, thresholdimage;

cv::cvtColor(src, hsvimage, CV_BGR2HSV);

cv::inRange(hsvimage, cv::Scalar(0, 0, 221), cv::Scalar(180, 30, 255), thresholdimage);

result = ~thresholdimage.clone();

2、形态学闭操作

因为分割的图像中间会有一些空洞,我们用形态学闭操作来弥补这个缺陷。

代码实现:

cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT,          cv::Size(kernelsize, kernelsize));

cv::morphologyEx(src, result, cv::MORPH_CLOSE, element, cv::Point(-1, -1));

3、生成标记区域

首先要生成前景区域,代码实现:

cv::distanceTransform(src, dist, CV_DIST_L2, 5);

cv::normalize(dist, dist, 0, 255, cv::NORM_MINMAX);

double minv = 0.0, maxv = 0.0;

cv::minMaxIdx(dist, &minv, &maxv);

cv::Mat sure_fg;

cv::threshold(dist, sure_fg, 0.4*maxv, 255, CV_THRESH_BINARY);

sure_fg.convertTo(sure_fg, CV_8U);

cv::imwrite("sure_fg.jpg", sure_fg);

然后生成背景区域,代码如下:

cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(kernelsize, kernelsize));

cv::morphologyEx(src, result, cv::MORPH_DILATE, element, cv::Point(-1, -1));

将上面两个结果相减得到未确定区域。

根据分水岭算法的特点,我们要把未确定区域设置为波谷值(例如0),而之前分割中背景也是0,因此通过连通域分析,我们将背景的值设置成1。代码如下:

cv::Mat labelmatImage = cv::Mat(dist.size(), CV_32SC1);

int label = cv::connectedComponents(sure_fg, labelmatImage, 8);

labelmatImage = labelmatImage + 1;

for (int i = 0; i < labelmatImage.rows; i++)

{

for (int j = 0; j < labelmatImage.cols; j++)

{

if ((int)unkonwn.at(i, j) == 255)

{

labelmatImage.at(i, j) = 0;

}

}

}

4、用分水岭算法进行分割

opencv自带的分水岭算法。代码如下:

cv::watershed(src, markers);

最后的效果只能是差强人意吧,大家如果有更好的方法,欢迎一起交流学习。

matlab计数重叠细胞,医学图像处理案例(三)——用分水岭算法分割重叠细胞相关推荐

  1. unet分割如何取其中一类_深度学习与医学图像处理 案例学习1——Unet肺部分割(CT图像)...

    内容引用自https://www.kaggle.com/toregil/a-lung-u-net-in-keras?select=2d_masks.zip #引入普通包 1 import os2 im ...

  2. Python OpenCV分水岭算法分割和提取重叠或有衔接的图像中的对象

    本文将介绍如何使用分水岭算法对触摸和重叠的图像中的对象进行分割和提取. 参考:https://www.pyimagesearch.com/2015/11/02/watershed-opencv/ 分水 ...

  3. 三维图像处理_医学图像处理案例(六)——生成血管三维模型

    在前面的文章中,已经分享了人体肋骨和肺组织分割生成三维模型的例子.今天将继续分享人体脑部血管分割并生成三维模型的案例. 1.导入MRA图像 大家肯定对MRI概念是很清楚的,但是对于MRA可能不太了解. ...

  4. matlab 分水岭法,分水岭算法Matlab实现——三种方法 | 学步园

    clear,clc%三种方法进行分水岭分割 %读入图像 filename='sar1.bmp'; f=imread(filename); Info=imfinfo(filename); if Info ...

  5. 机器视觉实验三: 基于分水岭算法的肺部图像分割实验(OpenCV-python代码)

    一.实验目的 用OpenCV编写一个基于分水岭算法的图像分割程序能对肺部医学图像进行分割,辅助医生进行病情诊断,强化和巩固学生对图像分割知识的掌握和灵活应用. 二.实验要求 1.用OpenCV编写一个 ...

  6. 基于matlab的脑瘤mr图像处理_基于Matlab GUI的医学图像处理课程虚拟实验平台设计...

    论文写作指导:请加QQ229366758 摘 要:针对医学生工程技术缺乏的状况,分析医学生学习医学图像处理存在的困难,提出利用Matlab图像处理工具和简单的GUI界面,设计和构建包含医学图像处理教学 ...

  7. 基于matlab生物医学影像处理,基于MATLAB的医学图像处理

    基于MATLAB的医学图像处理 届 别 2012 届 学 号 200814350135 毕业设计(论文)基于 MATLAB 的医学图像处理姓 名 唐 涛 系 别 . 专 业 计 算 机 科 学 系 . ...

  8. matlab图像处理将两个目标合成一个,利用MATLAB实现医学图像处理与分析

    [实例简介] 利用MATLAB实现医学图像处理与分析边缘是图像最基本的特征.所谓边缘是指图像周围像素灰度有阶跃变化或屋顶状变化的像素的集合, 它存在于目标与背景.目 标与目标.区域与区域.基元与基元之 ...

  9. 图像插值和缩放(matlab自实现)--冈萨雷斯《数字图像处理第三版》

    图像插值和缩放(matlab自实现) 1.Explanations of interpolation(插值释义) 1.1 Nearest Neighbor Interpolation(最近邻插值) 1 ...

  10. 医学图像处理——入门篇(三)

    工欲善其事,必先利其器 上一篇主要说了3个常用的python库(传送门),用他们可以做一些简单的医学图像处理,比如 检测.分割 都是可以做的,只不过得到的边缘轮廓可能没有那么精细.现在的需求太复杂,基 ...

最新文章

  1. 数字图像处理7:图像增强之灰度变换
  2. 自学python需要买书吗-学习Python的正确姿势—基础教学,教科书该怎么买?
  3. C++ 二维数组示例 - 控制台和MFC版
  4. #pragma comment(linker,/SECTION:shared,RWS)
  5. 子弹图(Bullet chart)绘制很难吗?绘制技巧整理送你~~
  6. 去哪里学习python_Python从哪里开始学?怎么入门?
  7. 现代软件工程 学生阅读和调查作业
  8. 安装oracle 10g闪退,Windows 7安装Oracle 10g常见错误及解决方法
  9. 解决 Block-scoped declarations (let, const, function, class) not yet supported outside strict mode at
  10. 19岁少女辍学就业,却遭身价2.5亿创业公司解雇
  11. 得益于数据中心芯片业务提升,AMD公司财务表现令投资者欣喜
  12. CAS简介和无锁队列的实现
  13. 递归算法php,PHP递归算法的详细示例分析
  14. C/C++利用netsh设置动态IP和静态IP
  15. Axure 基础教程
  16. 达尔优EM915镜面板游戏鼠标拆机教程
  17. UE5建筑可视化室内场景模型 Evermotion – Archinteriors for UE vol. 8
  18. 数据通信与网络:CH10 Error Detection and Correction
  19. 做网络必须掌握83句话
  20. 橙色简约大气岗位竞聘个人简历PPT模板

热门文章

  1. 记录一个找直线三等分点的方法及其证明
  2. JAVA - 银行卡认证
  3. Vue2在使用Element-UI的分页组件遇到的问题(如PageSize,PageNum等)
  4. 差异表达基因变化倍数_差异表达基因
  5. 差异表达基因变化倍数_【其他】差异基因筛选方法
  6. altium怎么锁定_在AD软件中的锁定与解锁命令应该如何使用?
  7. 人工智能应用-手把手教你用Python硬件编程实现打开或关闭电灯泡
  8. 猿编程 python_猿编程客户端下载_猿编程(小学阶段编程课程学习专用) 1.5.2 官方版_极速下载站...
  9. 主播被MCN解约并判违约金60万
  10. Qt编程之实现属性窗口编辑器