Обнаружение острых краев Java - PullRequest
0 голосов
/ 24 ноября 2018

Еще раз, я в беде.Я использую sobel edgedetector, чтобы получить края изображения.Я использую алгоритм bresenhams, чтобы нарисовать на другом конце.Но чтобы это произошло, мне нужны твердые координаты.

Мой sobel возвращает 2 0 для каждого ребра, и я просто не могу понять, почему.Если бы изображение было в два раза больше, это имело бы смысл, но это не так.

В PAINT я создал изображение размером 50x50 пикселей с квадратом одиночного пикселя, которое возвращает массив 48x48 int, похожий на этот.48x48 я понимаю, но 2 0 я не понимаю.

255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 255 255 255 0 0 255 255 255 255 255 255 255 255 255 0 0 255 255 255 255 255 255 255 255 255 0 0 255 255 255 255 255 255 255 255 255 0 0 255 255 255 255 255 255 255 255 255 0 0 255 255 255 255 255 255

, который я использую, происходит от метода, называемого массивом величин

public int[][] getMagnitudeArray() {

   int[][] filter1 = {
        {-1, 0, 1},
        {-2, 0, 2},
        {-1, 0, 1}
    };

    int[][] filter2 = {
        {1, 2, 1},
        {0, 0, 0},
        {-1, -2, -1}
    };

    Picture picture0 = new Picture(imagePath);
    int width = picture0.width()-2;
    int height = picture0.height()-2;
    int[][] arrayRepresentation = new int[width][height];

    for (int y = 0; y < height ; y++) {
        for (int x = 0; x < width ; x++) {

            // get 3-by-3 array of colors in neighborhood
            int[][] gray = new int[3][3];
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    gray[i][j] = (int) Luminance.intensity(picture0.get(x + i, y + j));
                }
            }

            // apply filter
            int gray1 = 0, gray2 = 0;
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    gray1 += gray[i][j] * filter1[i][j];
                    gray2 += gray[i][j] * filter2[i][j];
                }
            }
            // int magnitude = 255 - truncate(Math.abs(gray1) + Math.abs(gray2));
            int magnitude = 255 - binaryTruncate((int) Math.sqrt(gray1 * gray1 + gray2 * gray2));
            arrayRepresentation[x][y] = magnitude;
        }
    }

    return arrayRepresentation;
} `

Isесть кто-нибудь, кто может сказать мне, почему этот метод возвращает 2 0 и как я изменяю его, чтобы он возвращал только 1, 0?

Я пытался «исправить» его после того, как он возвращает массив с чертовски много, еслизаявления, но это не кажется очень элегантным или эффективным.

Спасибо.

...