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

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

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

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

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

И этосидеть. Я'Я делаю это с Java.

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

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

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

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

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

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

ЧТО МНЕ НУЖНО

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

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

Или даже лучше: я делал все это неправильно? Может быть, я не должентак много на этом сфокусировали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)

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