gpt4 book ai didi

java - 如何在图片/矩阵中递归旅行

转载 作者:行者123 更新时间:2023-12-01 18:35:50 25 4
gpt4 key购买 nike

我正在尝试创建一个函数,通过获取每个像素并递归搜索来将图片分成多个区域

如果它的 8 个邻居中的任何一个相似(通过比较它们的色调值),然后用相同的颜色在它们上绘画。

我从 (0,0) 开始简单,并尝试递归地“旅行”到任何相似的像素并将它们全部涂成红色,直到我陷入困境。

它在 55x55 图片上运行良好,但当我尝试 300x55 时,我遇到了著名的 StackOverflow 异常。

旅行功能(经过一些编辑,添加 boolean 矩阵来标记访问过的像素):

     private static void area( int x, int y){
//img and visited[][] are global variables
int height = img.getHeight();
int width = img.getWidth();
visited[x][y] = true;
int color = img.getRGB(x,y); // store before painting


// if(img.getRGB(x,y) != Color.RED.getRGB())
img.setRGB(x, y, Color.RED.getRGB());
// else
// return;


//spread to 8 directions clockwise
//top
if ((y - 1) >= 0)
if(!visited[x][y-1] && hsbSimilarity(color,img.getRGB(x,y - 1)))
area( x, y - 1);
//top right
if ((x + 1) < width && (y - 1) >= 0)
if(!visited[x+1][y-1] && hsbSimilarity(color, img.getRGB(x + 1,y - 1)))
area( x + 1, y - 1);
//right
if((x + 1) < width)
if(!visited[x+1][y] && hsbSimilarity(color, img.getRGB(x + 1,y)))
area( x + 1, y);
//bot right
if((x + 1) < width && (y + 1) < height)
if(!visited[x+1][y+1] && hsbSimilarity(color, img.getRGB(x + 1,y + 1)))
area(x + 1, y + 1);
//bot
if((y + 1) < height)
if(!visited[x][y+1] && hsbSimilarity(color, img.getRGB(x,y + 1)))
area(x, y + 1);
//bot left
if((x - 1) >= 0 && (y + 1) < height)
if(!visited[x-1][y+1] && hsbSimilarity(color, img.getRGB(x - 1,y + 1)))
area(x - 1, y + 1);
//left
if((x - 1) >= 0)
if(!visited[x-1][y] && hsbSimilarity(color, img.getRGB(x - 1,y)))
area( x - 1, y);
//top left
if((x - 1) >= 0 && (y - 1) >= 0)
if(!visited[x-1][y-1] && hsbSimilarity(color, img.getRGB(x - 1,y - 1)))
area(x - 1, y - 1);
}

比较功能:

    private static boolean hsbSimilarity( int rgb1, int rgb2){
Color color1 = new Color(rgb1);
Color color2 = new Color(rgb2);
float[] hsb1 = new float[3];
float[] hsb2 = new float[3];
color1.RGBtoHSB(color1.getRed(), color1.getGreen(), color1.getBlue(), hsb1);
color2.RGBtoHSB(color2.getRed(), color2.getGreen(), color2.getBlue(), hsb2);
int hue1 = (int)(hsb1[0] * 360);
int hue2 = (int)(hsb2[0] * 360);
int hueDistance = Math.abs(hue1 - hue2);

return hueDistance < 5 || hueDistance > 355 ; //circle concept where 0 equals to 360
}

最佳答案

您似乎遇到了循环问题。这意味着您的代码可能实际上是在循环运行(例如 0|0 0|1 0|0 等,或类似的东西)。而且这与尺寸无关,所以我很确定对于一张巨大的噪音图片来说一切都会很好,而对于一个完全红色的图片来说一切都会很糟糕。为了避免这个问题,我建议不要返回到您已经检查过的像素,因此可以尝试填充一个包含您已经访问过的像素的列表,然后检查您要前往的像素是否已经在其中,以及是否存在就是不要去那里。

关于java - 如何在图片/矩阵中递归旅行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60047209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com