- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个函数,通过获取每个像素并递归搜索来将图片分成多个区域
如果它的 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/
我正在制作一个应用程序,我在其中为每个国家/地区分配不同的值并根据该值执行某些操作。喜欢: Argentina 3 Australia 7 USA 23 要选择国家/地区,我需要使用用户当前所在的国家
这里是一般 Node mongodb 问题。 我有这个功能: static addSpaceToCreator = ( userId, spaceId, callback ) => {
Linux 中的 tcp 数据路径是否有很好的概述(2.6,如果路径实际不同则不是 2.4)?在 tcp/ip 堆栈处理的不同阶段,数据包在哪里? 数据包如何打包到tcp段,然后是ip数据包。它是如何
我是一名优秀的程序员,十分优秀!