关于Zhang快速并行细化算法

问题描述

这个是我写的关于Zhang细化算法的代码,不过细化的结果总有些问题,而且有时候会出现数组越界的情况,在Java包里面提示java.lang.ArrayOutOfBoundsException,不知道问题出在哪里。是在JAVA程序中运行的。publicvoidtwo_step_thinning1(int[][]s_grays,intim_w,intim_h){booleancanThin;//脏标记booleanmodified=true;//条件booleancondition1;booleancondition2;booleancondition3;booleancondition4;//联结数intt;//循环变量inti;intj;intr;intc;//中心像素8邻域内前景数intn;//开辟一个跟图像同样大小的数组int[][]mark;mark=newint[im_w][im_h];while(modified){modified=false;for(r=0;r<im_h;r++)for(c=0;c<im_w;c++)mark[r][c]=0;//初始化markfor(r=1;r<im_h-1;r++)for(c=1;c<im_w-1;c++){condition1=false;condition2=false;condition3=false;condition4=false;//判断P(r,c)是否为可细化像素if(s_grays[r][c]==255){canThin=true;//计算N(P)n=0;for(i=-1;i<=1;i++)for(j=-1;j<=1;j++)if(s_grays[r+i][c+j]==255)n++;n--;//中心像素不算if(2<=n&&n<=6)condition1=true;//计算T(P):四周像素由0变255的次数t=0;if(s_grays[r-1][c+1]-s_grays[r-1][c]>0)t++;//0->255if(s_grays[r][c+1]-s_grays[r-1][c+1]>0)t++;//0->255if(s_grays[r+1][c+1]-s_grays[r][c+1]>0)t++;//0->255if(s_grays[r+1][c]-s_grays[r+1][c+1]>0)t++;//0->255if(s_grays[r+1][c-1]-s_grays[r+1][c]>0)t++;//0->255if(s_grays[r][c-1]-s_grays[r+1][c-1]>0)t++;//0->255if(s_grays[r-1][c-1]-s_grays[r][c-1]>0)t++;//0->255if(s_grays[r-1][c]-s_grays[r-1][c-1]>0)t++;//0->255if(t==1)condition2=true;if(s_grays[r][c-1]*s_grays[r][c+1]*s_grays[r+1][c]==0&&s_grays[r-1][c]*s_grays[r][c+1]*s_grays[r+1][c]==0)condition3=true;if(s_grays[r+1][c]*s_grays[r][c-1]*s_grays[r-1][c]==0&&s_grays[r][c+1]*s_grays[r-1][c]*s_grays[r][c-1]==0)condition4=true;if(condition1&&condition2&&condition3&&condition4){mark[r][c]=1;}}}//根据标记结果删除for(r=1;r<im_h-1;r++)for(c=1;c<im_w-1;c++)if(mark[r][c]==1){s_grays[r][c]=0;modified=true;}}}

解决方案

解决方案二:
那一行出错?错误信息发来看看,或者给个能执行的main方法

时间: 2024-10-03 12:57:05

关于Zhang快速并行细化算法的相关文章

OpenCV学习(14) 细化算法(2)

      前面一篇教程中,我们实现了Zhang的快速并行细化算法,从算法原理上,我们可以知道,算法是基于像素8邻域的形状来决定是否删除当前像素.还有很多与此算法相似的细化算法,只是判断的条件不一样.在综述文章, Thinning Methodologies-A Comprehensive Survey中描述了各种细化算法的实现原理,有兴趣可以阅读一下.       下面看看图像细化的定义以及细化算法的分类: 图像细化(Image Thinning),一般指二值图像的骨架化(Image Skel

OpenCV学习(13) 细化算法(1)

程序编码参考经典的细化或者骨架算法文章: T. Y. Zhang and C. Y. Suen, "A fast parallel algorithm for thinning digital patterns," Comm. ACM, vol. 27, no. 3, pp. 236-239, 1984. 它的原理也很简单:       我们对一副二值图像进行骨架提取,就是删除不需要的轮廓点,只保留其骨架点.假设一个像素点,我们定义该点为p1,则它的八邻域点p2->p9位置如下图

fp-spark下运行并行FP-Growth算法当支持度&amp;amp;lt;0.001的时候数组溢出

问题描述 spark下运行并行FP-Growth算法当支持度<0.001的时候数组溢出 做微薄的数据挖掘,支持度需要设置比较小,运行的时候支持度大于0.001没有问题,但是小于的时候会出现数组溢出.报错位置为第二行:val part = res.partition(t1 => tail.exists(t2 => t1._1 == t2)) val p1 = gen(part._1) if (part._2.length == 0) return p1 else return decare

[文档]基于Hadoop平台的并行数据挖掘算法工具箱与数据挖掘云

基于Hadoop平台的并行数据挖掘算法工具箱与数据挖掘云 [下载地址]http://bbs.chinacloud.cn/showtopic-12728.aspx

OpenCV学习(18) 细化算法(6)

本章我们在学习一下基于索引表的细化算法. 假设要处理的图像为二值图,前景值为1,背景值为0. 索引表细化算法使用下面的8邻域表示法: 一个像素的8邻域,我们可以用8位二进制表示,比如下面的8邻域,表示为00111000=0x38=56 我们可以枚举出各种情况下,当前像素能否删除的表,该表大小为256.它的索引即为8邻域表示的值,表中存的值为0或1,0表示当前像素不能删除,1表示可以删除.deletemark[256] 比如下图第一个表示,索引值为0,它表示孤立点,不能删除,所以deletemar

OpenCV学习(17) 细化算法(5)

本章我们看下Pavlidis细化算法,参考资料http://www.imageprocessingplace.com/downloads_V3/root_downloads/tutorials/contour_tracing_Abeer_George_Ghuneim/theo.html Computer VisiAlgorithms in Image Algebra,second edition 该算法最初是做前景轮廓跟踪的. 假设使用下面的8邻域,且前景像素值为1,背景像素值为0. 下面是该算

OpenCV学习(15) 细化算法(3)

      本章我们学习一下Hilditch算法的基本原理,从网上找资料的时候,竟然发现两个有很大差别的算法描述,而且都叫Hilditch算法.不知道那一个才是正宗的,两个算法实现的效果接近,第一种算法更好一些. 第一种算法描述参考paper和代码: Linear Skeletons from Square Cupboards Speedup Method for Real-Time Thinning Algorithm http://cis.k.hosei.ac.jp/~wakahara/Hi

使用Weka快速实践机器学习算法

[译者注]在当下人工智能火爆发展的局面,每时每刻都有新的技术在诞生,但如果你是一个新手,Weka或许能帮助你直观.快速的感受机器学习带来的解决问题的新思路. Weka使机器学习的应用变得简单.高效并且充满乐趣.它拥有图形界面,并且允许你加载自己的数据集,运行算法并且产生足够可靠.让人信服的结果. 我把Weka推荐给机器学习的新手,因为它帮助我们把精力集中在机器学习应用的本身,而不是陷入数学和编程的泥潭.这些技能可以在后续的学习中逐渐掌握. 本文将一步步告诉你如何加载数据集,运行高级的分类算法并且

如何用最快速高效的算法来给一堆袜子配对?

昨天我在整理从洗衣店洗干净的一堆袜子,发现我用的方法非常不高效.我用了一个最简单的方法:拿到一只袜子,然后从头到尾去找另外一只袜子.用这种方法需要重复平均超过 n/2*n/4=n2/8 双袜子. 作为一个计算机科学家,我在想我应该怎么做?我立马就想到了根据尺寸颜色排序来得到一个复杂度为O(NlogN)的方法. 哈希或其他"非原地"的方法在这里不可取,因为我不可能复制袜子(要是可以的话就好了). 因此,这个基本问题是: 给一堆袜子,总数 n 双,即包含 2n 只袜子(袜子是乱放的,即不是