Проблема в том, что я пытаюсь идентифицировать растения по изображению дрона. Растения на изображении содержат перекрытия и имеют разные формы / размеры. Я не уверен, где искать или какие методы использовать для этого и ищу предложения.
Я взял отрывки из полного изображения полей и попытался: Использовать Convolusion Neural Networks для обучения XML-файла, который использовался в Java-программе, Использовал матрицы конвульсии 3x3, такие как резкость и обнаружение краев (специально сфокусированные на Собеле и Laplace), идентифицируйте каждое растение, взяв их значения RGB и выбрасывая все остальные. Я сосредоточил усилия на третьем методе определения их отдельных значений RGB, однако это сложно, поскольку все они имеют разные значения.
Это текущий код, который я использую для сканирования и удаления нерелевантных значений RGB:
Я храню только красный и синий, потому что забавно то, что зеленые значения растений и фона на самом деле почти идентичны.
Вот изображение поля:
У меня также есть несколько других изображений способов, которые я до сих пор пробовал:
Результат использования оператора 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, за которым следовал оператор Собеля, а затем использовать попиксельный анализ для отфильтровывания избыточных пикселей.