我正在尝试计算.png文件中黑色对象的边缘。我的意思是找到构成封装对象的框的列和行值。我附加了一个链接到我创建的照片,根据我找到的值绘制框。如您所见,顶部,底部和右侧线条似乎正确排列,但如果您放大到左侧线条,则部分图像位于框外。这是为什么?我有一个算法,我将在下面发布,搜索数组中的每个像素,找到最后一个像素值!= 0,顶部,底部,左侧和右侧。出于某种原因,左侧的额外图像正在记录== 0的像素...这些值是否向下舍入为零?如果有人能解释发生的事情会很棒。
以下是图片的链接:http://i.imgur.com/UG8Cghe.png。你真的必须放大左侧看看我在说什么。下载图像和查看可能是必要的。这是一个非常小的细节。
以下是将BufferedImage(.png)转换为2D数组的方法:
private static int[][] loadImageTo2D(String file_path)
{
img = null;
try { img = ImageIO.read(new File(file_path)); }
catch (IOException e) { System.out.println(e); }
int width = img.getWidth();
int height = img.getHeight();
int[][] pix = new int[height][width];
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
pix[row][col] = img.getRGB(col, row);
}//for
}//for
return pix;
}//loadImageTo2D
以下是我如何寻找双方:
private static int[] getPerim(int[][] pix)
{
//Array holds object boundary edges.
int[] lines = new int[4];
lines[BOTTOM] = 0;
lines[TOP] = pix.length;
lines[LEFT] = pix[0].length;
lines[RIGHT] = 0;
//Top down iteration, find the first and last row and column of the
//actual graphic.
for (int row = 0; row < pix.length; row++)
{
for(int col = 0; col < pix[0].length; col++)
{
if (pix[row][col] != 0)
{
if (row < lines[TOP]) { lines[TOP] = row; }
else if (row > lines[BOTTOM]) { lines[BOTTOM] = row; }
else if (col < lines[LEFT]) { lines[LEFT] = col; }
else if (col > lines[RIGHT]) { lines[RIGHT] = col; }
}//if
}//for
}//for
return lines;
}//getPerim
然后我使用lines []绘制您在图像中看到的蓝色框。救命啊!
答案 0 :(得分:1)
删除else
的{{1}}部分并将其全部if else
。只有其中一个如果可以执行。如果像素是最低和最左边的像素会发生什么?它将仅用作最底层的一个,因为if-else语句不会到达col部分。我建议你把它改成
if
不,你不能将左边框与右边框分组,因为它们可以在同一个像素上。