新手学,java使用分水岭算法进行图像分割(二)

最近要考试了,所以现在不写,怕这段时间都没空写了。(算法的效率暂时不考虑,有时间了再来解决彩色信息和效率问题)

继上一篇的算法:http://blog.csdn.net/abcd_d_/article/details/41218549,本文对分水岭算法进行了区域合并,合并准则采用hsv颜色空间的区域特征的直方图相似度进行合并。且看效果:图一是原图,图二是采用之前的文章算法的效果,图三为进行了区域合并后的效果。(大小被我调整过)

(图一)

(图二)

(图三)

在第一篇的基础之上,增加了区域合并算法,也就是下图中划横线的两个关键方法。可以从上图中看出,区域合并能有效去除过分割问题。

第一个方法相对简单,遍历图像找出领域关系,并存储在hashMap的一个对象nodes中。关键在第二个方法arearCombine(),它需要遍历nodes中的区域,并根据合并准则(这里是面积大小和区域相似度),判断是否把该区域合并到合适的领域中,这样两个区域就变为一个新区域。(这里涉及到邻接图的合并) 这样一遍一遍下来,直到没有区域被合并为止。

问题看似简单,但是问题来了,就是nodes这个数据结构每一次遍历后都会被修改,因此涉及到hashMap等集合不同在遍历的同时,又对其进行修改的问题。本文的方法比较笨,就是采用先记录下要修改的信息,然后在遍历完成之后再进行修改(这个麻烦,有更好的方法的朋友,请不吝赐教^_^)。

最后说明一下,本文要根据区域特征进行合并,所以添加了一个辅助类Img_Area_Feature ,该类记录下区域特征,并且进行区域的一些合并或者添加像素点操作。另外,文章的区域合并算法的关键在于合并准则的选择,修改size(面积)、similarity(相似度)的判断标准则,以及修改相似的判断方法均对效果产生直接影响,这也是这个合并算法的不足之处。

	/**
						 * ///此处的合并准则直接影响合并效果!!!!!!!!!!!!!!!!!!!!
						 */
						if(size<30){
							////少于10个像素,则合并到其中一个临域中
							simMap.put(similarity, child.getKey());
						}else if(similarity<0.1&&similarity!=-1&&size<500){
							///大于10个像素,则根据与临域的饱和度差和色调差选择性合并
							simMap.put(similarity, child.getKey());
						}else if(similarity<0.2&&similarity!=-1&&size<200){
							///大于10个像素,则根据与临域的饱和度差和色调差选择性合并
							simMap.put(similarity, child.getKey());
						}

例如,将上面的判断条件size<30改为size<100则效果如下图(图四),可以发现效果变化很明显:

(图四)

最后附上代码地址:http://download.csdn.net/detail/abcd_d_/8223951 (要一个积分:最近要下载,积分紧张,所以。。。)

时间: 2024-08-29 12:55:11

新手学,java使用分水岭算法进行图像分割(二)的相关文章

新手学,java使用分水岭算法进行图像分割(一)

最近被图像分割整的天昏地暗的,在此感谢老朋友周洋给我关于分水岭算法的指点!本来打算等彩色图像分割有个完满的结果再写这篇文章,但是考虑到到了这一步也算是一个阶段,所以打算对图像分割做一个系列的博文,于是先写这篇. 啰嗦了这么多!先看效果: 效果一般,存在着很多过分割现象,但比没使用滤波之前的效果好很多,过分割是分水岭算法的通病.这个后续博文会继续解决. 本文用java实现的是基于自动种子区域的分水岭算法,注意本文是基于单色的分割,所以将输入图片首先进行灰度化处理,这个比较简单,不多提了:因此,对于

新手学JAVA(三)----StringBuilder类

上一篇文章新手学JAVA(二)----String类与StringBuffer类的区别中了解到,String的值是不可变的,这就导致 每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间,StringBuffer是可变 类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象. StringBuffer类和StringBuilder类功能基本相似.算是两个双胞胎. 下面主要说两点 第一点  线程安全 StringBuffer  线程安全

【经验分享】新手学Java编程语言怎么入门?

新手学Java编程语言怎么入门?掌握语言基础是第一步,了解java基础知识,Java关键字.核心概念或者基本编码技术.掌握操作符.控制执行流程.访问权限控制.复用类.多态.接口.字符串.泛型.数组.容器深入研究.JavaI/O系统.枚举类型.并发以及图形化用户界面等内容. 为了帮助大家更轻松的学好java开发,给大家分享一套java开发学习资料,小编推荐一个学java开发技术的学习裙:三七四三二零二八二,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干

新手学,java使用分水岭算法进行图像切割(一)

近期被图像切割整的天昏地暗的,在此感谢老朋友周洋给我关于分水岭算法的指点!本来打算等彩色图像切割有个完满的结果再写这篇文章,可是考虑到到了这一步也算是一个阶段,所以打算对图像切割做一个系列的博文,于是先写这篇. 啰嗦了这么多!先看效果: 效果一般,存在着非常多过切割现象,但比没使用滤波之前的效果好非常多,过切割是分水岭算法的通病.这个兴许博文会继续解决. 本文用java实现的是基于自己主动种子区域的分水岭算法,注意本文是基于单色的切割,所以将输入图片首先进行灰度化处理,这个比較简单,不多提了:因

新手转行学java难吗?新手学java需要注意的6个方面!

新手转行在成都学java到底难不难,对于这个问题,我们专门做过一个调查,超过1000名已经在职的java从业者,其中有80%的程序员觉得学java不难,20%的程序员觉得前期有点难,其中对于50%自学的新手认为java很难学,遇到问题没人解答,又或者是答案太多,根本不知道哪个回答是正确的.所以,我们得出结论,能系统学习的,有老师指导的java课程学起来相对容易,而没有人指导,仅仅靠看视频学习的同学来说会无形中增加难度. 很多新手在准备转行学习java之前,在网上看到或听到很多不懂的人会说,jav

从零开始学Java之出入门卫管理(二)

    这个系统包含了四块,第一块就是人员管理,经理分配三位分别有"ABC"权限的人,分别管理请假申请,请假审批,门卫登记管理.同时不属于本公司的内部人员,如别的公司的人员如果想到本公司访问,也是先通过这"ABC"权限的三个人代为写来访申请,来访审批,来访门卫登记管理.     具体步骤如下:     因为后面都会用到很多相同的方法,和相同的属性,所以我先建立了两个接口让后面的方法类和属性类都实现这两个接口,这样就降低了耦合度.     从零开始学Java之出入门卫

新手学Java笔记心得之Java基础

第一次学习Java,一些基本的常用的快捷方式和一些很基础的知识点(笔记比较零散比较乱) Java是一种既面向对象又可以跨平台的语言,即:编写一次,随处运行: Java不仅适用于单机应用程序和基于网络的程序,也可用于创建消费类设备的附件程序,如移动电话.掌上设备等. Java命名规范首字母可以是字母,下划线'_','$'符号后面加上任意多的数字,字母,下划线,'$'符号通常第一个单词的首字母小写,其后单词的 首字母大写.例如:myScore MyEclipse编写Java代码的快捷键(新手不推荐使

新手学JAVA(六)----处理随机性的数据

基础知识 实例 在我们的日常生活中会遇到很多随机性的事情,比如:摇奖,彩票,掷色子,这些都可以通过程序计算其中奖的概率.在JAVA的类库中,有一个专门操作这种随机性数据的类--Random类. 基础知识 Random类一般使用在那些随机性比较强的场合,因为这些场合都含有一种随机的特性,也就是使用同样的方法去操作数据,每次操作的结果都不一样. 下面是Random类的常用方法: 方法 表示 public boolean nextBoolean() 返回true或者是false public doub

新手学Java(一)——Equals和“==”的区别

一句话概括: 如果操作两边都是对象句柄,就比较两个句柄是否指向同一个对象.如果两边是基本类型,则比较的就是值. ==不属于任何类,而equals则是任何类(Java中)的一个方法. equals()是每个对象与生俱来的方法,因为所有类的最终基类就是Object(除去Object本身):而equals()是Object的方法之一. 我们可以这样比较: 1)Primitive1(基本类型)== Primitive2(基本类型) 2)Object1 Reference1(对象引用)== Object1