|
- scanImage = function(img,crop){
- var tlines = {};
-
- //首先计算出图片的高度宽度,避免重复的调用
- var w = img.getWidth();
- var h = img.getHeight();
- /*
- 作用相当一个开关,首先值为false,但黑点首次被遍历到时。把这个值变为true。
- 下次,再找到这个点时忽略。避免重复加入连通线。
- */
- var tChked ={};
- for(i=0;w;1){
- tChked[ i ]={};
- for(j=0;h;1){
- tChked[ i ][j]=false;
- }
- }
-
- ////-去噪
- img.bpp(1);
- img.bpp(24);
-
- //首先计算出各点的颜色值,避免在循环递归中重复的取
- var tcl={};
- for(i=0;w;1){
- tcl[ i ]={};
- for(j=0;h;1){
- tcl[ i ][j]=img.getPixel(i,j);
- }
- }
-
- /*
- 算点数函数
- 参数x,y 坐标
- 参数tab 所属连通线;
- */
- var function seed(x,y,tab){
-
- //-出界了则返回
- if(x<0 or y<0 or x>w or y>h) {
- return;
- };
-
- //-点的颜色为白色时,返回,不处理。
- if(tcl[x][y]==16777215) {
- return;
- };
-
- //-值为1,则计数加1,返回
- if ( tChked[x][y]) {
- return ;
- }
- else{
- table.insert(tab,{x=x;y=y} );//添加到连通线里
- tChked[x][y]=true;//-当值为0时,把值置为1。
- seed(x+1,y-1,tab);
- seed(x,y-1,tab);
- seed(x-1,y-1,tab);
- seed(x-1,y,tab);
- seed(x+1,y,tab);
- seed(x-1,y+1,tab);
- seed(x,y+1,tab);
- return seed(x+1,y+1,tab); //这里可以用一个尾调用(参考教程中的函数部分),加快递归的速度。
- };
- };
-
- ////遍历图像中的所有点
- for(i=0;w;1){
- for(j=0;h;1){
- //-如果是黑色的点,而且没有被计过数,则调用seed函数。
- if(tcl[ i ][j]==0 and (not tChked[ i ][j])) {
- var tab = {}
- seed(i,j,tab);
- table.insert(tlines,tab); //添加一条连通线
- };
- };
- };
-
- //现在tlines 里记录了的有的连通线,我们现在需要根据连通线的长度排序
- var sproc = function( line ) {
- return #owner > #line;//长的连通线排到前面
- }
- table.sort(tlines,sproc)
-
- //把图像全部画成白色的点
- for(i=0;w;1){
- for(j=0;h;1){
- img.setPixel( i , j, 16777215);
- };
- };
-
- //然后把最长的一条连通线画上去
- for(i=1;#tlines[1];1){
- var point = tlines[1][ i ]
- img.setPixel( point.x, point.y , 0);
- }
-
- //如果需要去掉周围的空白
- if(crop){
- var n = #(tlines[1])
-
- //排序最长连通线中的所有坐标点
- var sproc = function( pt ) {
- return (owner.x < pt.x );//*左的排前面
- };
- table.sort(tlines[1],sproc);
- var x,x2 = tlines[1][1].x, tlines[1][n].x;
-
- //排序最长连通线中的所有坐标点
- var sproc = function( pt ){
- return ( owner.y < pt.y );//*上的排前面
- };
- table.sort(tlines[1],sproc);
- var y,y2 = tlines[1][1].y, tlines[1][n].y;
-
- img.crop( x,y,x2+1,y2)
- }
-
- };
- import inet.http;
- import soImage;
- var img = soImage();
- img.setBytes(
- inet.http.get("http://bbs.aardio.com/data/attachment/forum/201210/21/193552w2epoh10qwgqcqxq.png")
- ,"*.png" )
-
- img.paint(); //在屏幕上处理前的图像
- var w,h = img.getWidth(),img.getHeight()
- scanImage(img,true);
- img.resize(w,h);
- img.paint(); //在屏幕上显示处理后的图像
复制代码 |
评分
-
查看全部评分
|