我有包含黑色和白色像素的数据BufferedImage,它以这样的二维数组表示
protected int[][] arr = {{1,1,1,1,1,0,0},
{1,0,0,0,1,0,0},
{1,0,0,0,1,0,0},
{1,1,1,1,1,0,0},
{0,0,0,0,0,0,0}};
数组值为1表示像素为白色,黑色像素为0。
我想创建一个值得跟踪数组1并将被跟踪的数组转换为0的程序,如下所示:
第一次迭代:
0111100
1000100
1000100
1111100
0000000
第二次迭代:
0011100
1000100
1000100
1111100
0000000
第三:
0001100
1000100
1000100
1111100
0000000
第四:
0000100
1000100
1000100
1111100
0000000
第五 :
0000000
1000100
1000100
1111100
0000000
第六名:
0000000
1000000
1000100
1111100
0000000
直到最后一次迭代,所有数组值都将为0。
我做了一个这样的程序:
public void cekNearby()
{
/* for(int y=0;y
{
for(int x=0;x
{
*/
int x=0,y=0;
if(arr2[y][x] ==1)
{
startPointX = x;
startPointY = y;
int moveNextX=x,tempX = arr.length;
int moveNextY=y,tempY = arr[0].length;
arr2[y][x]=0;
while(startPointX!= tempX || startPointY != tempY)
{
System.out.println("MoveNextX->"+moveNextX+"moveNextY->"+moveNextY+"tempX ->"+tempX+" tempY ->" +tempY +" StartpointX->"+startPointX +" startPointY ->"+startPointY );
int moveY = max(0,moveNextY-1) ;
ketemu = false;
System.out.println("Atas"+moveNextX +""+moveNextY);
while(moveY <= min(arr2.length-1,moveNextY+1) && ketemu == false)
{
System.out.println("ASD"+moveY);
int moveX = max(0,moveNextX-1);
while(moveX <=min(arr2[0].length-1,moveNextX+1) && ketemu == false)
{
System.out.print(" Y :" + moveY);
System.out.print(" X :"+moveX);
if(arr2[moveY][moveX]==1)
{
arr2[moveY][moveX]=0;
tempX = moveX;
tempY = moveY;
moveNextX = moveX;
moveNextY = moveY;
ketemu = true;
System.out.print("Ketemu");
}else
{
ketemu = false;
}
moveX++;
}
moveY++;
System.out.println();
}
print_array(arr2);
}
}
}
但是,完成迭代后,这些位置会有白色像素。
0000000
0000000
0000000
1000100
0000000
我的逻辑有什么问题?
任何建议将不胜感激。
您面临什么问题?
从我的源代码中可以看到,搜索是通过在数组数组startpointX附近找到1,startpointY从start到y-1到y +1,然后x-1到x +1的循环方式完成的,问题是当搜索时 index位于(2,4)的数组等于1,表示检测到数组索引(3.3)应该为(3,4)。 那么当搜索位于(3,1)索引等于1时(2,0)应该为(3,0)
对不起,英语不好。 问题是当搜索索引位于(2,4)数组等于1时,即检测到索引(3.3)应该为(3,4)。 那么当搜索位于(3,1)索引等于1时(2,0)应该为(3,0)
看一眼您的输出,似乎您使用了8个单元的邻域; 您似乎只想删除一个1像素的"游程",因此这是正确的:
11100 01100 00100 00000 00000 00000 00000
10101 10101 10101 10101 10001 10001 00001
11101 11101 11101 11101 11101 10101 10101
在底部像素之前检查左下像素,在左像素之前检查左上像素。 如果只想成直角,则需要使用四个邻域。 在每种情况下,右侧的断开连接都将保留。
如果要同时具有直角和对角线,则必须优先选择一个角度。 按照以下顺序检查周围的像素:
516
2 3
748
如果要删除所有相邻的单元格,而不仅仅是一次连接的单元格,则可能需要使用Floodfill算法。
感谢Floodfill算法解决了我的问题。