Zasadniczo chcę zaimplementować funkcję wymiany koloru dla mojej aplikacji malowania. Poniżej są oryginalne i oczekiwany wynikwymiana koloru w obrazie dla aplikacji iPhone
oryginalny:
Po zmianie koloru ściany wybranej przez użytkownika wraz z pewnym progiem do wymiany
próbowałem dwa podejścia, ale nie mógł dostał działa zgodnie z oczekiwaniami
Podejście 1:
Queue-based Flood Fill algorytm zastępowania kolorów: , ale otrzymałem poniżej wydajność z niesamowicie powolnym i cień ściany nie został zachowany.
Podejście 2: Więc próbowałem patrzeć na inną opcję i znaleźć poniżej słupka z tak How to change a particular color in an image?
ale nie mogłem zrozumieć logikę i nie wiesz o moim implementacji kodu z krok 3.
Proszę znaleźć poniżej kod dla każdego kroku mądry z moim zrozumieniem.
1) Konwertuj obraz z RGB na HSV, używając cvCvtColor (chcemy tylko zmienić kolor na ).
IplImage *mainImage=[self CreateIplImageFromUIImage:[UIImage imageNamed:@"original.jpg"]];
IplImage *hsvImage = cvCreateImage(cvGetSize(mainImage), IPL_DEPTH_8U, 3);
IplImage *threshImage = cvCreateImage(cvGetSize(mainImage), IPL_DEPTH_8U, 3);
cvCvtColor(mainImage,hsvImage,CV_RGB2HSV);
2) izolowania kolor z cvThreshold określając pewną tolerancję (chcesz gamę kolorów, a nie jedno mieszkanie koloru).
cvThreshold(hsvImage, threshImage, 0, 100, CV_THRESH_BINARY);
3) Zniszcz obszary koloru poniżej minimalnej wielkości za pomocą blob wykrywania biblioteki jak cvBlobsLib. Spowoduje to pozbycie się kropek o podobnym kolorze w scenie. Czy muszę podać oryginalny obraz lub zdjęcie z okresu świątecznego?
CBlobResult blobs = CBlobResult(threshImage, NULL, 0);
blobs.Filter(blobs, B_EXCLUDE, CBlobGetArea(), B_LESS, 10);
4) Maska koloru z cvInRangeS i użyć wynikającą maskę zastosować nowy odcień.
Not sure about this function, jak to pomaga w zastępowaniu kolorów i nie jest w stanie zrozumieć argumentów, które należy podać.
5) cMZmień nowy obraz z nowym odcieniem z obrazem złożonym z nasycenia i jasności kanałów zapisanych w kroku pierwszym.
Rozumiem, że cvMerge połączy się z trzema kanałami H S i V, ale jak mogę użyć wyjścia powyżej trzech kroków.
więc w zasadzie skazani realizacji OpenCV,
jeśli to możliwe to proszę kierować do mnie implementacja OpenCV lub jakimkolwiek innym roztworze Tryout'y.
nie będzie wystarczająca do zmiany tylko odcienia w punkcie 4 i używać oryginalnego nasycenie krok 5. Spójrz na ścianę w twoim przykładzie. Jest szary. Nasycenie szarości jest zerowe (lub bardzo bliskie zeru), co oznacza, że odcień nie ma żadnego efektu. Aby obrócić tę ścianę na niebiesko, musisz ustawić nasycenie na coś bliższego jednemu (* i * musisz ustawić odcień). –
Rob myślisz, że mój drugi i trzeci krok są poprawne? –
@JigarParekh Mam ten sam problem, ale muszę to zrobić w czasie rzeczywistym (czyli w obrazie z kamery), więc możesz udzielić wskazówek, jak to zrobić – Prabhakar