2012-12-07 9 views
6

mam mapowanie kilka elementów Photoshop CIFilter, jedyny Mam problemy ze jest to regulacja poziomów:Jak mogę odwzorować dostosowanie poziomu Photoshopa na filtr Core Image?

screen shot from current version of photoshop

Które filtra CI (lub kombinacji filtrów) będzie pozwól mi wykorzystać 16, 1.73, 239, & 39/245 powyżej w pierwszym przykładzie lub 31, 1,25, 255 30/255 w drugim przykładzie. Uważam, że jest to rodzaj dostosowania poziomu cienia/czerni i bieli.

Każda pomoc doceniona.

Odpowiedz

8

Poprzez dostosowanie formuły z tej strony: http://http.developer.nvidia.com/GPUGems/gpugems_ch22.html, uważam, że można to zrobić za pomocą kombinacji CIColorMatrix, CIGammaAdjust i innymi CIColorMatrix.

Nazwijmy poziomy wejściowe inBlack, inGamma i inWhite odpowiednio, a poziomy wyjściowe outBlack i outWhite. Zauważ, że kolor Photoshopa zawiera się w przedziale od 0 do 255, natomiast kolory CI są w przedziale od 0 do 1, więc musisz podzielić wartości Photoshopa (z wyjątkiem inGamma!) Przez 255 przed umieszczeniem ich w następujących formułach.

Mapowanie wejście jest pixel = (inPixel-inBlack)/(inWhite-inBlack), co oznacza, że ​​pierwsza matryca będzie

red = [1/(inWhite-inBlack) 0 0 0] 
green = [0 1/(inWhite-inBlack) 0 0] 
blue = [0 0 1/(inWhite-inBlack) 0] 
alpha = [0 0 0 1] 
bias = [-inBlack/(inWhite-inBlack), -inBlack/(inWhite-inBlack),-inBlack/(inWhite-inBlack), 0] 

Następnie należy zastosować korekcję gamma używając CIGammaAdjust oraz numer inGamma (musiałem użyć odwrotność 1/inGamma robiąc moich obliczeń, spróbować także!).

Wreszcie odwzorowanie wyjście jest piksel = gammaCorrectedPixel * (outWhite - outBlack) + outBlack, co daje ostateczną matrycę

red = [(outWhite - outBlack) 0 0 0] 
green = [0 (outWhite - outBlack) 0 0] 
blue = [0 0 (outWhite - outBlack) 0] 
alpha = [0 0 0 1] 
bias = [outBlack outBlack outBlack 0] 

Nie rzeczywiście próbował to za pomocą CoreImage, ale obliczenia wyszło ładnie!

+0

Czy możesz wyjaśnić tę część? pixel = gammaCorrectedPixel * (outWhite - outBlack) + outBlack – Eric

+0

Formuła z linku to 'outPixel = (pow ((inPixel * 255.0) - inBlack)/(inWhite - inBlack), inGamma) * (outWhite - outBlack) + outBlack)/255.0' tak, że jest to część poza 'pow' (formuła jest dekonstruowana w jedno mnożenie macierzy stosowane przed' pow', '' pow 'samo stosowane jako korekcja gamma, a następnie macierz dla wszystkiego, co dzieje się po'. pow). – jakber

+0

, więc inBlack = 31, inGamma = 1,25 i inWhite = 255? Następnie musimy podzielić te wartości przez 255? –

Powiązane problemy