java - BufferedImage 到 2D 数组 : Finding pixelated edges

标签 java bufferedimage pixel

我正在尝试计算 .png 文件中黑色对象的边缘。我的意思是找到构成封装对象的框的列和行值。我附加了一个链接到我创建的照片,该照片根据我找到的值绘制框。正如您所看到的,顶部、底部和右侧的线似乎正确排列,但如果放大到左侧的线,则图像的一部分位于框外。这是为什么?我有一个算法,我将在下面发布它,该算法搜索数组中的每个像素,并找到顶部、底部、左侧和右侧最后一次出现的像素值 != 0。由于某种原因,左侧的额外图像正在注册 == 0 的像素...这些值是否向下舍入为零?如果有人可以解释正在发生的事情那就太好了。

这是图像的链接:/image/i96a5.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[]来绘制您在图像中看到的蓝色框。救命!

最佳答案

删除 if elseelse 部分,并将它们全部设为 if 。只能执行其中一个 if else。如果像素是最下面和最左边的像素,会发生什么?它将仅用作最底层,因为 if-else 语句不会到达 col 部分。我建议你改成

            if (row < lines[TOP]) { lines[TOP] = row; }
            if (row > lines[BOTTOM]) { lines[BOTTOM] = row; }
            if (col < lines[LEFT]) { lines[LEFT] = col; }
            if (col > lines[RIGHT]) { lines[RIGHT] = col; }

不,您不能将左边框与右边框组合在一起,因为它们可以位于同一像素上。

关于java - BufferedImage 到 2D 数组 : Finding pixelated edges,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21369253/

相关文章:

c - "radial blur"使用 OpenMP

java - 调用 jar 文件时指定 JVM 参数?

java - 如何在java spark中解析json请求

java - 在java中将RAW图像转换为jpg

Java从paintComponent()外部绘制形状到bufferedImage?

java - 从 Java 图像中检索像素数据

image - 将像素排序为中值过滤器

java - AS3/Java - 从 live Flash 到本地 java 的套接字连接

java - Servlet 和 Applet 之间的自定义对象

c++ - C/C++ LIBTIFF : Need to read pixel location of white and black pixels from BW TIFF files