Как я могу определить / посчитать, сколько объектов на изображении, которое перекрывается - PullRequest
1 голос
/ 08 июля 2019

Проблема в том, что я пытаюсь идентифицировать растения по изображению дрона. Растения на изображении содержат перекрытия и имеют разные формы / размеры. Я не уверен, где искать или какие методы использовать для этого и ищу предложения.

Я взял отрывки из полного изображения полей и попытался: Использовать Convolusion Neural Networks для обучения XML-файла, который использовался в Java-программе, Использовал матрицы конвульсии 3x3, такие как резкость и обнаружение краев (специально сфокусированные на Собеле и Laplace), идентифицируйте каждое растение, взяв их значения RGB и выбрасывая все остальные. Я сосредоточил усилия на третьем методе определения их отдельных значений RGB, однако это сложно, поскольку все они имеют разные значения.

Это текущий код, который я использую для сканирования и удаления нерелевантных значений RGB: Я храню только красный и синий, потому что забавно то, что зеленые значения растений и фона на самом деле почти идентичны.
Вот изображение поля: enter image description here

У меня также есть несколько других изображений способов, которые я до сих пор пробовал: Результат использования оператора sobel

//important data

int pixX = 330; //resolution of image
int pixY = 370;
int pixT = pixX * pixY; //total amount of pixels

int xloc = 0;//used to locate pixels to remove
int yloc = 0;
File test = new File("FILE.png)
int x = 0, y = 0; //Current XY values
int colorsplit[][] = new int[2][pixT];//obtaining red and blue will be stored in this 2d array

try {
        for (int c = 0; c < pixT - 1; c=c+2) { //I use C+2 to jump 2 pixels to make the process faster

BufferedImage image = ImageIO.read(test);//buffered image read

int clr = image.getRGB(x, y); //getting values as binary(? i think)
int red = (clr & 0x00ff0000) >> 16; //bit shifting for red values
    int blue = clr & 0x000000ff; //Blue values

for (int n = 0; n < 4; n++) { // this is used to store values so that a single run will store the same value twice for 2 pixels side by side (efficiency measures)

switch (n) {//switch to store Red Blue codes
case 0:
            colorsplit[0][c] = red;//store
    break;
case 1:
        colorsplit[1][c] = blue;//store
    break;

case 2:
    colorsplit[0][c + 1] = red;//store
    break;
case 3:
    colorsplit[1][c + 1] = blue;//store
        }

}//END switch
    x = x + 2;
if (x == pixX) {//Going up in XY values to cover all values
    x = 0;
    y++;
    }//end if
}//end for

     ...//end of try, catch IOException

for (int c = 0; c < pixT; c++) { //Starting to identify redundant pixels

    if (colorsplit[0][c] > 200 || colorsplit[1][c] > 100) { //parameters of redundant pixels

xloc = c % pixX;
yloc = c / pixX;//locating XY pixels

image.setRGB(xloc, yloc, 0); //Setting redundant pixels to black
System.out.println(xloc + "," + yloc + " setted"); //confirmation text

    }//end for
//end

Я не получаю много ошибок, однако проблема заключается в том, что программа работает не так, как задумано.

Редактировать: Оказывается, большинство вещей было в порядке, но я не сделал ничего, кроме как объединить несколько программ идентификации. Закончилось делать уменьшение RGB, чтобы получить только значения R, за которым следовал оператор Собеля, а затем использовать попиксельный анализ для отфильтровывания избыточных пикселей.

...