2015-04-20 9 views
6

Chciałbym wyodrębnić pojedynczy kolor (np. # A87830) z obrazu, zmieniając co drugi kolor na biały. Wejście może być nieco hałaśliwe, więc sąsiadujące z pikseli o zbliżonym kolorze mogą być uwzględnione. Idealnie wszystkie białe piksele na końcu byłyby konwertowane na kolor czarny (tzn. Wyjście jest obrazem o 1-bitowej głębokości).Usuń wszystkie kolory z obrazka (wiersz poleceń lub kod)

Możliwe, że chcę to przetworzyć wsadowo, więc mam nadzieję na coś w rodzaju linii poleceń imagemagick lub coś, co mógłbym zakodować za pomocą rozszerzenia PHP imagemagick. (Jestem pewien, że ImageMagick musi być w stanie to zrobić, jeśli poprawne parametry mogą być właśnie opracowane, dlatego je otagowałem, ale jestem otwarty na inne oprogramowanie, o ile działa na Linuksie.)

Tło: staram się zrobić pierwszy etap przebiegu wyprzedzającego w programie ContourTrace, która jest ładnie pokazany przez tego zdjęcia:

enter image description here

Odpowiedz

7

Oto jeden spróbować:

convert        \ 
    http://i.stack.imgur.com/rK259.png \ 
-fuzz 33%       \ 
-fill black       \ 
-opaque "#A87830"     \ 
-threshold 12%      \ 
    black+white.png 

Parametr -fuzz robi dopasować kolory, które są w pewnej odległości od koloru zdefiniowanym przez -opaque. No -fuzz, a dopasujesz tylko te piksele, które są dokładnie "#A87830".

Konwertuje piksele koloru na czarny lub biały, gdzie wartość procentowa określa limit: nad kolorem czarnym, poniżej kolorem białym.

black+white.png

Można zmodyfikować polecenie -opaque "<color-definition>" do +opaque "<color-definition>" do wywrócenie rozumieniu wyboru koloru: będzie zastąpić piksele, które nie są w tym kolorze (tym razem pominąć parametr w celu -threshold aby zachować kolory):

convert        \ 
    http://i.stack.imgur.com/rK259.png \ 
-fuzz 33%       \ 
-fill black       \ 
+opaque "#FFFFFF"     \ 
    other.png 

other.png

+0

Aha! Zmiana z '-opaque' na' + opaque' daje prawie to, co chcę (czarne i białe są w złym kierunku, ale myślę, że nawet moje umiejętności ImageMagick potrafią je rozszyfrować ...) –

9

Nie jestem pewien, czy to jest wystarczająco zaawansowany dla Ciebie. Konwersja wszystkich pikseli podobnych, w 30% podanego koloru, na czarny, a następnie uczyń resztę białą.

convert in.png -fuzz 30% -fill black -opaque "#a87830" -threshold 10% out.png 

enter image description here

Można "dodać" więcej dźwięków, które chcesz, aby stać się czarny, dodając kolejne -opaque polecenia, jak to

convert in.jpg -fuzz 20% -fill black \ 
    -opaque "#a87830"     \ 
    -opaque "#a6725f"     \ 
    -threshold 1% out.png 

które pozwalają zmniejszyć fuzz, a tym samym usunąć inne dźwięki, których nie chcesz.

+0

Dzięki! Jakie są różne znaczenia 30% i 10% w linii poleceń? Miałem nadzieję, że będzie coś w rozumieniu "Pozwól na podobny kolor, ale tylko jeśli sąsiadują z pikselem docelowego koloru". To pozwoliłoby na pomieszanie jpeg/skanera, ale nie zawierało czarnych i fioletowych linii, które ma twój przykład. –

+0

30% oznacza * "wybierz piksele w odległości 30% pod względem odległości kolorów" * od wartości "a87830".Próg 10% oznacza, że ​​wszystkie piksele RGB należy ustawić na mniej niż 25,25,25 (tj. 10% z 255) na czarno, a wszystkie wartości powyżej tej wartości na biały. Tak więc obraz wyjściowy będzie czysty czarno-biały. –

+0

Zauważyłem, że nawet jeśli zmniejszę zarówno fuzz, jak i próg do 1%, nadal otrzymam wszystkie czarne linie z oryginału. (Należy zachować tylko brązowe linie, więc czarne linie powinny przejść do białej, tak jak wszystko inne.) –