Czy istnieje odpowiedni algorytm do wykrywania koloru tła figury?

Na studiach otrzymaliśmy zadanie, w którym, biorąc pod uwagę obraz, musimy zidentyfikować „figurki”, ich kolor i ilość „grup pikseli” w nich. Pozwól mi wyjaśnić:

Powyższy obraz ma jedenpostać (na obrazku może być wiele postaci, ale na razie zapomnijmy o tym).

Kolor tła płótna to piksel przy 0,0 (w tym przypadku żółty)Kolor obramowania figury jest czarny (może to być dowolny kolor inny niż kolor tła płótna).Kolor tła figury jest biały (może być również taki sam jak kolor tła płótna).Postać może mieć tylko jeden kolor tła.Na rysunku są dwie grupy pikseli. Jedna to pula niebieskich pikseli, a druga to pula czerwonych z zielonymi wewnątrz. Jak widać, nie ma znaczenia kolor pikseli grupy pikseli (jest on inny niż kolor tła figury). Liczy się fakt, że są w kontakcie (nawet po przekątnej). Tak więc, pomimo dwóch różnych kolorów, taka grupa i tak jest uważana za jedną.Jak widać, granica może być tak nieregularna, jak sobie życzysz. Ma jednak tylko jeden kolor.Wiadomo, że grupa pikseli nie dotknie granicy.Powiedziano mi, że kolory grupy pikseli mogą być dowolne z wyjątkiem koloru tła figury. Zakładam, że wtedy może być taki sam jak kolor obramowania figury (czarny).

Otrzymaliśmy klasę zdolną do robienia zdjęć i przekształcania ich w macierz (każdy element jest liczbą całkowitą reprezentującą kolor piksela).

I to wszystko. Robię to z Javą.

CO ROBIŁEM TAKIE DUŻO

Iteruj przez każdy piksel w matrycyJeśli znajdę piksel inny niż kolor tła, założę, że należy do granicy figury. Nazywam ten pikselinitialPixel od teraz.Zauważ, żeinitialPixel na obrazku, który podałem, jest ten czarny piksel w lewym górnym rogu figury. Zrobiłem tam ostry cios, aby to zilustrować.Moją misją jest teraz znalezienie koloru tła rysunku (w tym przypadku białego).

Ale mam sporo kłopotów, aby znaleźć taki kolor tła (biały). Jest to najbliższa metoda, którą zrobiłem, która działała w niektórych przypadkach - ale nie w przypadku tego obrazu:

Ponieważ znam kolor obramowania, mogłem znaleźć pierwszy inny kolor, który jest dlapołudnie zinitialPixel. Brzmiał jak dobry pomysł - czasami działał, ale nie działałby z dostarczonym obrazem: w tym przypadku wróci żółty, ponieważinitialPixel jest daleko od zawartości figury.

Zakładając, że znalazłem kolor tła figury (biały), moim następnym zadaniem byłoby uświadomienie sobie, że na rysunku są dwie grupy pikseli. Ten wydaje się łatwiejszy:

Ponieważ teraz znam kolor tła figury (biały), mogę spróbować iterować przez każdy piksel na figurze i, jeśli znajdę taki, który nie należy do granicy i nie jest częścią tła figury, mogę już powiedzieć, że jest jedna grupa pikseli. Mogę rozpocząć funkcję rekurencyjną, aby znaleźć wszystkie piksele powiązane z taką grupą i „oznaczyć” je tak, że w przyszłych iteracjach mogę całkowicie zignorować takie piksele.

CZEGO POTRZEBUJĘ

Tak, mój problem polega na tym, jak znaleźć kolor tła figury (pamiętaj, że może być taki sam jak kolor tła całego obrazu - na razie jest żółty, ale może być również biały) w oparciu o to, co opisałem wcześniej.

Nie potrzebuję żadnego kodu - po prostu mam problem z właściwym algorytmem. Fakt, że granica może mieć tak dziwne nieregularne linie, zabija mnie.

Albo nawet lepiej: czy robiłem to przez cały czas źle? Może nie powinienem się tak bardzo skupiaćinitialPixel w ogóle. Może zadziałałaby inna metoda początkowa? Czy są jakieś dokumenty / przykłady dotyczące takich tematów? Zdaję sobie sprawę, że istnieje wiele badań dotyczących „wizji komputerowej” i tak dalej, ale nie mogę znaleźć wiele informacji na temat tego konkretnego problemu.

NIEKTÓRY KOD

Moja funkcja do pobrania wektora ze wszystkimi liczbami: * Uwaga:Figure jest tylko klasą zawierającą pewne wartości, takie jak kolor tła i liczba elementów.

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;
}

Następnie, wyraźnie, funkcjaretrieveFigure(y,x) to jest to, czego nie mogę zrobić.

Uwagi:

Do celów edukacyjnych nie powinienem używać żadnych zewnętrznych bibliotek.

questionAnswers(2)

yourAnswerToTheQuestion