Существует ли правильный алгоритм определения цвета фона фигуры?

Для колледжа нам дали задание, в котором по изображению мы должны определить «цифры», их цвет и количество «пиксельных групп» внутри них. Позволь мне объяснить:

На изображении выше есть одинфигура (на изображении может быть несколько фигур, но давайте пока об этом забудем).

Цвет фона холста - пиксель в 0,0 (в данном случае, желтый)Цвет границы рисунка - черный (это может быть любой цвет, кроме цвета фона холста).Цвет фона рисунка - белый (он также может совпадать с цветом фона холста).Фигура может иметь только один цвет фона.На рисунке две группы пикселей. Один - это пул синих пикселей, а другой - пул красного с зеленым внутри. Как видите, не имеет значения цвет пикселей группы пикселей (он просто отличается от цвета фона рисунка). Важно то, что они находятся в контакте (даже по диагонали). Таким образом, несмотря на наличие двух разных цветов, такая группа в любом случае считается только одной.Как видите, граница может быть нерегулярной, как вы хотите. Он имеет только один цвет.Известно, что группа пикселей не будет касаться границы.Мне сказали, что цвета группы пикселей могут быть любыми, кроме цвета фона фигуры. Я предполагаю, что тогда он может быть таким же, как цвет границы фигуры (черный).

Нам был дан класс, способный снимать изображения и преобразовывать их в матрицу (каждый элемент представляет собой целое число, представляющее цвет пикселя).

Вот и все. Я делаю это с Java.

Что я сделал так далеко

Итерация по каждому пикселю в матрицеЕсли я найду пиксель, отличный от цвета фона, я предположу, что он принадлежит границе рисунка. Я назову этот пиксельinitialPixel впредь.Обратите внимание, чтоinitialPixel на изображении, которое я указал, изображен черный пиксель в верхнем левом углу рисунка. Я специально сделал резкий разрез, чтобы проиллюстрировать это.Моя задача сейчас - найти цвет фона фигуры (в данном случае белый).

Но у меня довольно много проблем, чтобы найти такой цвет фона (белый). Это самый близкий метод, который я сделал, который работал в некоторых случаях - но не с этим изображением:

Так как я знаю цвет границы, я мог бы найти первый другой цвет, которыйюг изinitialPixel, Звучит как хорошая идея - иногда это работает, но не будет работать с предоставленным изображением: в этом случае он вернется желтым, посколькуinitialPixel довольно далеко от содержания фигуры.

Предполагая, что я нашел цвет фона фигуры (белый), моей следующей задачей было бы осознать, что внутри фигуры существуют две группы пикселей. Этот кажется проще:

Так как теперь я знаю цвет фона фигуры (белый), я могу попытаться перебрать каждый пиксель на фигуре, и, если я найду тот, который не принадлежит границе и не является частью фона фигуры, я уже могу сказать, что есть одна группа пикселей. Я могу начать рекурсивную функцию, чтобы найти все пиксели, связанные с такой группой, и пометить их так, чтобы в будущих итерациях я мог полностью игнорировать такие пиксели.

ЧТО МНЕ НУЖНО

Да, моя проблема заключается в том, как найти цвет фона фигуры (имейте в виду, что он может совпадать с цветом фона всего изображения - пока он желтый, но может быть и белым) на основе того, что я описал ранее.

Мне не нужен какой-либо код - мне просто трудно придумать правильный алгоритм для такого. Тот факт, что на границе могут быть такие странные нерегулярные линии, убивает меня.

Или даже лучше: я делал все это неправильно? Может быть, я не должен был сосредоточиться на этомinitialPixel вообще. Может быть, сработал бы другой метод? Есть ли какие-либо документы / примеры на подобные темы? Я понимаю, что есть много исследований по «компьютерному зрению» и тому подобное, но я не могу найти много об этой конкретной проблеме.

НЕКОТОРЫЙ КОД

Моя функция для извлечения вектора со всеми фигурами: * Примечание:Figure это просто класс, который содержит некоторые значения, такие как цвет фона и количество элементов.

public Figure[] getFiguresFromImage(Image image) {
    Figure[] tempFigures = new Figure[100];
    int numberOfFigures = 0;
    matrixOfImage = image.getMatrix();
    int imageBackgroundColor = matrixOfImage[0][0];
    int pixel = 0;

    for (int y = 0; y < matrixOfImage.length; ++y) {
        for (int x = 0; x < matrixOfImage[0].length; ++x) {
            pixel = matrixOfImage[y][x];
            if (!exploredPixels[y][x]) {
                // This pixel has not been evaluated yet
                if (pixel != imageBackgroundColor ) {
                    // This pixel is different than the background color
                    // Since it is a new pixel, I assume it is the initial pixel of a new figure
                    // Get the figure based on the initial pixel found
                    tempFigures[numberOfFigures] = retrieveFigure(y,x);
                    ++numberOfFigures;
                }
            }
        }   
    }

    // ** Do some work here after getting my figures **

    return null;
}

Тогда, понятно, функцияretrieveFigure(y,x) это то, что я не могу сделать.

Примечания:

В учебных целях я не должен использовать какие-либо внешние библиотеки.

Ответы на вопрос(2)

Ваш ответ на вопрос