Na studia dostaliśmy zadanie, w którym, biorąc pod uwagę obraz, musimy zidentyfikować "liczby", ich kolor i ilość "grup pikseli" wewnątrz nich. Pozwól mi wyjaśnić:Czy istnieje odpowiedni algorytm do wykrywania koloru tła figury?
Obraz powyżej ma jedno postać (w obrazie może być wiele figury, ale zapomnijmy o tym na razie).
- kolor tła płótna jest piksel na 0,0 (w tym przypadku, żółty)
- kolor obramowania rysunku czarna (może to być jakikolwiek inny kolor niż płótna kolor tła).
- Kolor tła figurki jest biały (może również być taki sam, jak kolor tła płótna).
- Rysunek może mieć tylko jeden kolor tła.
- Na rysunku są dwie grupy pikseli. Jedna to pula niebieskich pikseli, a druga to pula czerwieni z odrobiną zieleni w środku. Jak widać, nie ma znaczenia kolor pikseli w pikselach (jest po prostu inny niż kolor tła postaci). Liczy się to, że mają kontakt (nawet po przekątnej). Tak więc pomimo dwóch różnych kolorów, taka grupa jest mimo wszystko uważana za jedną.
- Jak widać, granica może być tak nieregularna, jak chcesz. 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 postaci. Zakładam, że wtedy może być taki sam, jak kolor ramki (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 zrobiłem SO FAR
- iterację każdego piksela na matrycy
- Jeśli znajdę piksel, który jest inny od koloru tła, będę zakładać, że należący do granicy Figura. Nazwę ten piksel
initialPixel
od teraz. - Należy zauważyć, że
initialPixel
na podanym obrazie to czarny piksel w lewym górnym rogu figury. Ostro naciąłem go, aby to zilustrować. - Moją misją jest teraz znalezienie koloru tła figury (w tym przypadku białego).
Ale mam dużo problemów, aby znaleźć taki kolor tła (biały). Jest to najbliżej sposób ja, który pracował w niektórych przypadkach - ale nie z tym obrazem:
- Ponieważ znam kolor obramowania, mogę znaleźć pierwszą inny kolor, który jest do południowo z
initialPixel
.Brzmiało to jak dobry pomysł - czasami działało, ale nie działałoby to z dostarczonym obrazem: w tym przypadku zmieni kolor na żółty, ponieważinitialPixel
jest dość oddalony od zawartości figury.
Zakładając, że znalazłem kolor tła postaci (biały), moim następnym zadaniem byłoby uświadomienie sobie, że istnieją dwie grupy pikseli na rysunku. Ten wydaje się łatwiejsze:
- Od teraz wiem koloru tła rysunku za (biały), mogę spróbować iteracja każdego piksela w rysunku, a jeśli znajdę taki, który nie należy do granicy i nie jest częścią z tła postaci, mogę już powiedzieć, że jest jedna grupa pikseli. Mogę rozpocząć funkcję rekursywną, aby znaleźć wszystkie piksele związane z taką grupą i "oznaczyć ją", aby w przyszłości iteracje całkowicie ignorować takie piksele.
co muszę
Tak, mój problem jest o tym, jak znaleźć kolor rysunku w tle (należy pamiętać, to może być takie samo jak cały obraz w kolorze tła - na razie to żółte, ale może też być biały) w oparciu o to, co opisałem wcześniej.
Nie potrzebuję żadnego kodu - po prostu mam problem z przemyśleniem odpowiedniego algorytmu. Fakt, że granica może mieć tak dziwne, nieregularne linie, zabija mnie.
Albo jeszcze lepiej: czy przez cały czas robiłem źle? Może w ogóle nie powinienem koncentrować się na tym initialPixel
. Może działałby inny rodzaj początkowej metody? Czy są jakieś dokumenty/przykłady dotyczące takich tematów? Zdaję sobie sprawę, że istnieje wiele badań nad "wizją komputerową" i takimi, ale nie mogę znaleźć wiele na temat tego konkretnego problemu.
jakiś kod
Moja funkcja do pobrania wektorowych z wszystkich figur: * Uwaga: Figure
jest właśnie klasa, która zawiera pewne wartości, takich jak kolor tła i liczby 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, funkcja retrieveFigure(y,x)
to co mam jest w stanie to zrobić.
Uwagi:
- w celach edukacyjnych, nie należy używać żadnych zewnętrznych bibliotek.
jak u zdefiniować tło obrazu i powie do twojego programu? – DarthVader
na Twoim zdjęciu? jest białe lub żółte? Nie mogę nawet tego powiedzieć. nawet czerń może być tłem. – DarthVader
@DarthVader: Ah! Przepraszam. Kolor tła płótna to piksel o wartości 0,0. I figura nie dotknie granicy płótna. – Voldemort