Как вычислить матрицу совместного появления в Java? - PullRequest
0 голосов
/ 25 августа 2018

У меня вопрос по формуле совместного использования.Как я могу реализовать в Java вычисление GLCM изображения?

Конкретно я пытаюсь выяснить, как вычислить количество раз, когда пиксель имеет интенсивность x, а пиксель в его непосредственном правом имеет интенсивность y.Мне также нужно сохранить полученное значение в x -ой строке и y -ом столбце полученной матрицы совместного вхождения.

Ожидаемое поведение показано ниже:

GLCM Alghoritm

Вот что я получил до сих пор:

КОД (еще не завершен)

public class MainClass {
final static int[][] matrix= {
        {2,4,1,3},
        {7,2,1,6},
        {1,1,2,2},
        {1,2,5,8}
};
static int i;
static int j;
static int x;
static int y;
static int c;
static int d;
static int maxValue = matrix[0][0];
static int minValue = matrix[0][0];

public static void main(String[] args) {
    // TODO Auto-generated method stub

    for(i = 0; i< matrix.length; i++) {
        for(j=0; j < matrix[i].length; j++) {
            System.out.print(matrix[i][j] + "");
            if(matrix[i][j] > maxValue) {
                maxValue=matrix[i][j];
            }
            else if(matrix[i][j] < minValue) {
                minValue=matrix[i][j];
            }                               
        }
        System.out.println();
    }       
    System.out.println("maxValue = "+ maxValue);

    int count = 0;
    for(int i=0; i< matrix.length; i++) {
        for (int j=0; j<matrix[i].length; j++) {
             int x = i;
             int y = j;
             if(matrix[x][y] == 1 & matrix[x][y+1] ==1) {
                 count ++;
             }
             System.out.println(matrix[x][y+1]);
        }
    }
}

OUTPUT (ОШИБКА)

2413
7216
1122
1258
maxValue = 8
4
1
3
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
 at main.MainClass.main(MainClass.java:45)

Я бы предпочел не использовать сторонние библиотеки, такие как OpenCV или jfeaturelib.

1 Ответ

0 голосов
/ 27 августа 2018

Этот код выполняет работу:

public class MainClass {

    final static int[][] I = {
        {1, 1, 5, 6, 8},
        {2, 3, 5, 7, 1},
        {4, 5, 7, 1, 2},
        {8, 5, 1, 2, 5}
    };

    public static int getMaxValue(int[][] array) {
        int maxValue = array[0][0];
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                if (array[i][j] > maxValue) {
                    maxValue = array[i][j];
                }
            }
        }
        return maxValue;
    }

    static int maxValue = getMaxValue(I);

    public static void main(String[] args) {

        System.out.println("I");
        for (int row = 0; row < I.length; row++) {
            for (int col = 0; col < I[row].length; col++) {
                System.out.print(I[row][col] + " ");
            }
            System.out.println();
        }

        System.out.println("maxValue = " + maxValue);

        int[][] GLCM = new int[maxValue + 1][maxValue + 1];

        for (int row = 0; row < I.length; row++) {
            for (int col = 0; col < I[row].length - 1; col++) {
                int x = I[row][col];
                int y = I[row][col + 1];
                GLCM[x][y]++;
            }
        }

        System.out.println("GLCM");
        for (int x = 1; x <= maxValue; x++) {
            for (int y = 1; y <= maxValue; y++) {
                System.out.print(GLCM[x][y] + " ");
            }
            System.out.println();
        }
    }
}

выход

I
1 1 5 6 8 
2 3 5 7 1 
4 5 7 1 2 
8 5 1 2 5 
maxValue = 8
GLCM
1 2 0 0 1 0 0 0 
0 0 1 0 1 0 0 0 
0 0 0 0 1 0 0 0 
0 0 0 0 1 0 0 0 
1 0 0 0 0 1 2 0 
0 0 0 0 0 0 0 1 
2 0 0 0 0 0 0 0 
0 0 0 0 1 0 0 0

Примечания

  1. Я предполагаю, что минимальная интенсивность равна 1. Если вы хотите рассмотреть пиксели со значением интенсивности 0, вам следует изменить два последних цикла for следующим образом:

    for (int x = 0; x <= maxValue; x++) {
        for (int y = 0; y <= maxValue; y++) {
    
  2. Предложенное решение дает матрицу Кокуренса, соответствующую вектору смещения «на один пиксель вправо». Если вы хотите вычислить GLCM, используя другой вектор смещения, вам нужно настроить код. Например, следующий фрагмент возвращает GLCM, соответствующий «смещению на один пиксель вверх»:

    for (int row = 1; row < I.length; row++) {
        for (int col = 0; col < I[row].length; col++) {
            int x = I[row][col];
            int y = I[row - 1][col];
            GLCM[x][y]++;
        }
    }
    
...