[Medical Image Process] 3.4 Morphology Application—Watershed Algorithm 分水岭算法
1. 分水岭原理
分水岭的概念和形成可以通过模拟浸入过程来说明。在每一个局部极小值表面,刺穿一个小孔,然后把整个模型慢慢浸入水中,随着浸入的加深,每一个局部极小值的影响域慢慢向外扩展,在两个集水盆汇合处构筑大坝,即形成分水岭。分水岭的计算过程是一个迭代标注过程。
分水岭比较经典的计算方法是L.Vincent提出的。在该算法中,分水岭计算分两个步骤,一个是排序过程,一个是淹没过程。首先对每个像素的灰度级进行从低到高的排序,然后再从低到高实现淹没过程中,对每一个局部极小值在H阶高度的影响域采用先进先出(FIFO)结构进行判断及标注。
分水岭变换得到的是输入图像的集水盆图像,集水盆之间的分界点即为分水岭。显然分水岭表示的是输入图像极大值点。因此为了得到图像的边缘信息,通常把梯度图像作为输入图像,即g(x,y)=grad(f(x,y))=sqrt{[f(x,y)-f(x-1,y)]^2 + [f(x.y)-f(x,y-1)]^2}。
分水岭算法对微弱的边缘具有良好的响应,是得到封闭连续边缘的保证。另外,分水岭算法所得到的封闭的集水盆,为分析图像的区域特征提供了可能。
实际应用过程中,由于一幅图像存在非常多极小值,就会造成图像的过分割。通常可以采用两种方法加以解决,一是利用先验知识去除无关边缘信息。二是修改梯度函数,使得集水盆只响应想要探测的目标。为了降低分水岭算法产生的过度分割,通常要对梯度函数进行修改,一个最简单的方法就是对梯度图像进行阈值处理,用以消除灰度的微小变化产生的过度分割。即g(x,y)=max(grad(f(x,y)),gΘ),式中gΘ表示阈值。程序可采用的方法:用阈值限制梯度图像已达到消除灰度值的微小变化造成的过分割结果,获得适量分割区域,在对这些区域的边缘点的灰度级进行从高到低的排序,然后再从低到高实现淹没过程。梯度图像用Sobel算子计算获得。对梯度图像进行阈值处理时,选取合适的阈值对最终分割的图像有很大影响,因此阈值的选取是图像分割效果好坏的一个关键。缺点:实际图像中可能含有微弱的边缘,灰度变化的数值差别不是特别明显,选取阈值过大可能会消去这些微弱边缘。
2. Matlab仿真分析分水岭算法
2.1 算法综述
2.2 算法执行步骤
2.3 matlab 仿真研究
clc; clear all; close all;
ImgRgb = imread('apple.jpg');
if ndims(ImgRgb) == 3I = rgb2gray(ImgRgb);
elseI = ImgRgb;
end
%Sobel 求图像边缘
hy = fspecial('sobel');
hx = hy';
Iy = imfilter(double(I), hy, 'replicate');
Ix = imfilter(double(I), hx, 'replicate');
GradMag = sqrt(Ix.^2 + Iy.^2);
%直接利用梯度函数图像分割
L = watershed(GradMag);
%基于开运算的重建
se = strel('disk', 20);
ImgOpen = imopen(I, se);
ImgErode = imerode(I, se);
ImgErodeConstrnct = imreconstruct(ImgErode, I);
%基于闭操作的图像重建
Ioc = imclose(ImgOpen, se);
ImgErodeConstrnctDilate = imdilate(ImgErodeConstrnct, se);
ImgErodeConstrnctDilateConstruct = imreconstruct(imcomplement(ImgErodeConstrnctDilate), imcomplement(ImgErodeConstrnct));
ImgErodeConstrnctDilateConstruct = imcomplement(ImgErodeConstrnctDilateConstruct);
%标记前景的极大值
fgm = imregionalmax(ImgErodeConstrnctDilateConstruct);
%去除前景中的零散点,并进行区域收缩
se2 = strel(ones(5,5));
fgm2 = imclose(fgm, se2);
fgm3 = imerode(fgm2, se2);
%进一步去除小的连通域
fgm4 = bwareaopen(fgm3, 20);
%标记背景
bw = im2bw(ImgErodeConstrnctDilateConstruct, graythresh(ImgErodeConstrnctDilateConstruct));
%脊线分割
D = bwdist(bw);
DL = watershed(D);
bgm = DL == 0;
gradmag2 = imimposemin(GradMag, bgm | fgm4);
L = watershed(gradmag2);
It1 = ImgRgb(:, :, 1);
It2 = ImgRgb(:, :, 2);
It3 = ImgRgb(:, :, 3);
fgm5 = imdilate(L == 0, ones(3, 3)) | bgm | fgm4;
It1(fgm5) = 0; It2(fgm5) = 255; It3(fgm5) = 0;
I4 = cat(3, It1, It2, It3);
Lrgb = label2rgb(L, 'jet', 'w', 'shuffle');
figure('units', 'normalized', 'position', [0 0 1 1]);
subplot(1, 2, 1); imshow(ImgRgb, []); title('原图像');
subplot(1, 2, 2); imshow(I4, []); title('标记和对象边缘叠加到原图像');
[Medical Image Process] 3.4 Morphology Application—Watershed Algorithm 分水岭算法相关推荐
- 基于边缘的图像分割——分水岭算法(watershed)算法分析(附opencv源码分析)
最近需要做一个图像分割的程序,查了opencv的源代码,发现opencv里实现的图像分割一共有两个方法,watershed和mean-shift算法.这两个算法的具体实现都在segmentation. ...
- 【OpenCV】 - 图像分割之分水岭算法,watershed()函数的输出,对marker和image的改变
一.背景 最近在学分水岭算法的opencv函数watershed()时,对函数执行完后image和marker的变化一无所知.懵懵懂懂. 于是便结合网上资料和自己现身说法,给大家分享一下[waters ...
- Opencv每日函数 图像分割模块 watershed分水岭算法
一.分水岭理论概述 任何灰度图像都可以看作是一个地形表面,其中高强度表示峰和丘陵,而低强度表示山谷.您开始用不同颜色的水(标签)填充每个孤立的山谷(局部最小值).随着水位的上升,根据附近的山峰(梯度 ...
- Watershed segmentation 分水岭分割
分水岭是用于分割的经典算法,即用于分离图像中的不同对象. 从用户定义的标记开始,分水岭算法将像素值视为局部地形(高程).该算法从标记中泛洪盆地,直到归因于不同标记的盆地在分水岭线上相遇.在许多情况下, ...
- 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(五)分水岭算法(watershed algorithm)
8.5 分水岭算法(watershed algorithm) 1.基于拓扑理论的数学形态学的分割方法. 2.基本思想:把图像看作测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局 ...
- OpenCV 【四】————Watershed Algorithm(图像分割)——分水岭算法的原理及实现
分水岭算法实现(C++.opencv) 1.作用: 通常用于分割图像,主要实现以临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性 ...
- OpenCV学习(二十) :分水岭算法:watershed()
OpenCV学习(二十) :分水岭算法:watershed() 参考博客: OpenCV-分水岭算法 图像处理--分水岭算法 OpenCV学习(7) 分水岭算法(1) Opencv分水岭算法--wat ...
- OpenCV3学习(7.2)——图像分割之二(分水岭算法watershed)
分水岭算法原理 分水岭算法是一种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性是分水岭 ...
- Python+OpenCV:基于分水岭算法的图像分割(Image Segmentation with Watershed Algorithm)
Python+OpenCV:基于分水岭算法的图像分割(Image Segmentation with Watershed Algorithm) ############################ ...
最新文章
- webstorm github怎么用_前端开发神器WebStorm发布最新版本2019.3,代码完成更加智能...
- Simulating Ocean Water (2) (2005-03-31 update)
- HDU 1058(打表)
- Android线程管理(一)
- PIE_SDK.NET功能表
- Debian卸载iceweasel
- 芭比扣了!Nacos中服务删除不了,肿么办?
- 服饰贴图定制小程序V1.2.4安装更新一体包+小程序前端
- root用户连接mysql数据库出错 1045 access denied for user 'root'@'localhost' using password yes
- 微服务Springcloud超详细教程+实战(二)
- sql语句查看MySQL数据库大小
- hane WIN nfs配置
- 微信公众号问题:{errcode:40125,errmsg:invalid appsecret, view more at http:\/\/t.cn\/LOEdzVq, hints: [ ...
- 信息系统项目管理师必背知识点(完整版)
- Java实现蓝桥杯快乐数
- 嵌入地图跳转高德地图_各种地图跳转导航
- Unity游戏动画 从入门到住院:动画状态机
- 13700k和13700kf的区别 i7 13700k和13700kf怎么选
- matlab学习——线性规划
- 利用unity和steamVR完成场景漫游(五) 学习VRTK中简单案例
热门文章
- Mac下安装及使用rz、sz远程上传下载文件
- 利用Inotify和Rsync将webproject文件自己主动同步到多台应用server
- 大型网站技术架构文摘
- mysql开启查看慢查询日志[转]
- 别跟我说测试的坏话...
- 我学员的一个问题及其我对之的解答,关于lr返回值问题
- clcikhouse Code: 1000. DB::Exception: File not found
- hdu 5280(最大子串和变形,dp)
- VUE+SpringBoot+JWT实现token验证,SSO单点登录
- reduction_indices的用法