2014-01-26 2 views
0

Я пытаюсь вычислить края черного объекта в файле .png. И под этим я имею в виду найти значения столбца и строки, которые составляют ящик, который инкапсулирует объект. Я прикрепил ссылку на фотографию, которую я создал, которая рисует окно в соответствии со значениями, которые я нахожу. Как видите, верхняя, нижняя и правая линии выглядят правильно, но если вы увеличиваете масштаб до левой строки, часть изображения находится за пределами поля. Почему это? У меня есть алгоритм, который я буду размещать ниже, который ищет каждый пиксель в массиве и находит последнее вхождение значений пикселей! = 0 для верхней, нижней, левой и правой сторон. По какой-то причине дополнительное изображение с левой стороны регистрирует пиксели, которые == 0 ... Величины округляются до нуля? Если кто-то может объяснить, что происходит, это будет здорово.BufferedImage to 2D Array: Поиск пиксельных краев

Ссылка на изображение: 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 

Я тогда с использованием линии [], чтобы нарисовать синий квадрат, который вы видите на изображении. Помогите!

ответ

1

Оставьте else часть if else и сделайте все из них if s. Только один из них, если elses может быть выполнен. Что произойдет, если пиксель - самый нижний и самый левый пиксель? Он будет использоваться только как самый нижний, поскольку оператор 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; } 

И нет, вы не можете сгруппировать левую границу с правой границей, так как они могут быть на том же пикселе.