рд░рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди: рдкрддрд▓реА рддрд╛рд▓рд┐рдХрд╛ рдЦреЛрдЬреЗрдВ

рдпрд╣ рдкрд┐рд▓реНрд▓реЛ 5.2 рдореЗрдВ рдкреЗрд╢ рдХреА рдЧрдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рд╣реИ : рд░рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рддреАрди-рдЖрдпрд╛рдореА рд▓реБрдХрдЕрдк рдЯреЗрдмрд▓ (3 рдбреА рд▓реБрдЯреНрд╕) рдХрд╛ рдЙрдкрдпреЛрдЧред рдпрд╣ рддрдХрдиреАрдХ рд╡реАрдбрд┐рдпреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдФрд░ 3 рдбреА рдЧреЗрдо рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдЧреНрд░рд╛рдлрд┐рдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ 3 рдбреА рдПрд▓рдпреВрдЯреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░ рд╕рдХрддреА рд╣реИрдВред


рддреАрди-рдЖрдпрд╛рдореА рд▓реБрдХрдЕрдк рдЯреЗрдмрд▓ рд░рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд▓рдЪреАрд▓рд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЪрд╛рд╣реЗ рд╡реЗ рдХрд┐рддрдиреЗ рднреА рдЬрдЯрд┐рд▓ рд╣реЛрдВред


from PIL import Image, ImageFilter

def washout(r, g, b):
    h, s, v = _rgb_to_hsv(r, g, b)
    if 0.3 < h < 0.7:
        s = 0
    return _hsv_to_rgb(h, s, v)

im = Image.open('./Puffins.jpg')
im = im.filter(ImageFilter.Color3DLUT.generate(17, washout))

рдкрд╛рдпрдерди рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рдлреАрдЪрд░ 75ms рдореЗрдВ 16.6-рдореЗрдЧрд╛рдкрд┐рдХреНрд╕реЗрд▓ рдЪрд┐рддреНрд░ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред



рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрд╕рд╛рдзрди-рдЧрд╣рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдРрд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд╕рдВрдж рд╣реИрдВ рдЬреЛ рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рджреВрд░ рдХрд░рддреЗ рд╣реИрдВред рдкрд╛рдВрдЪ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдкрд┐рд▓реЛ рдореЗрдВ рдПрдХ рдЧрд╛рдКрд╕реА рдзрдмреНрдмрд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ , рдЬреЛ рдХрд┐рд╕реА рднреА рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ред рдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереА рдХрд┐ рдЖрдк рдЧреБрдгрд╡рддреНрддрд╛ рдХреА рдиреНрдпреВрдирддрдо рд╣рд╛рдирд┐ рдХреЗ рд╕рд╛рде рдирд┐рд░рдВрддрд░ рд╕рдордп рдореЗрдВ рдЫрд╡рд┐ рдХреЛ рдХреИрд╕реЗ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдЖрдЬ рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдЖрдк 3D LUT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреА рд╕реАрдорд╛рдПрдБ рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рдореИрдВ рддрдХрд┐рдП-рд╕рд┐рдордб рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреАрдВрдЧ рдорд╛рд░ рд░рд╣рд╛ рд╣реВрдБред


рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд░реЗрдВ - рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛


: , . - , ( 0 255). , HSV , Hue, , , Saturation, , , Value, . , , Saturation - , . .


? , , . - , , . API, , , , . .


, , . , , , . , : , , , . API тАФ .



- . , . , , , . , , - !


, . . , , RGB #e51288, [229, 18, 136]. тАФ , RGB-. :



. 256┬│, 16 , 48 . 48 тАФ . , L3 , . , 16 , 16 , , , . ?


, . , -- , . , , , 16┬│ . 12 , L3, L1 .



? тАФ . , , ( ) .


, , . , , , . , .


3D LUT


, - . : , , , , . . . , -, . .


: , , , . , , .


, , . , , , . , . , , , - ( , ) .


?


, Pillow. API Color3DLUT PIL.ImageFilter. , :


from PIL.ImageFilter import Color3DLUT

table = [(0, 0, 0), (1, 0, 0), (0, 1, 0), (1, 1, 0),
         (0, 0, 1), (1, 0, 1), (0, 1, 1), (1, 1, 1)]
lut = Color3DLUT(2, table)

тАФ . , . :


from PIL import Image
Image.open('in.jpg').filter(lut).save('out.jpg')

, . - , :



тАФ - , generate, . , . 3D-.


def transform(r, g, b):
    r, g, b = (max(r, g, b), g, min(r, g, b))
    avg_v = r * 0.2126 + g * 0.7152 + b * 0.0722
    r += (r - avg_v) * 0.6
    g += (g - avg_v) * 0.6
    b += (b - avg_v) * 0.6
    return r, g, b

lut = Color3DLUT.generate(17, transform)
Image.open('in.jpg').filter(lut).save('out.jpg')


- , . : - , . , . Pillow-lut. rgb_color_enhance, :


from pillow_lut import rgb_color_enhance
lut = rgb_color_enhance(
    11, exposure=1, contrast=0.3, vibrance=-0.2, warmth=0.3)
Image.open('in.jpg').filter(lut).save('out.jpg')


, , ? : .cube ( , ) hald- тАФ , .



Pillow-lut .


from pillow_lut import load_hald_image 
lut = load_hald_image('hald.6.hefe.png')
Image.open('in.jpg').filter(lut).save('out.jpg')


тАФ , , ! , , . rgb_color_enhance , , :


lut = load_hald_image('hald.6.hefe.png')
lut = rgb_color_enhance(
    lut, exposure=1, contrast=0.3, vibrance=-0.2, warmth=0.3)
Image.open('in.jpg').filter(lut).save('out.jpg')


, . rgb_color_enhance. transform_lut, .


, ┬л┬╗. ? . , 1, , тАФ . . amplify_lut:


from pillow_lut import load_hald_image, amplify_lut
lut = load_hald_image('hald.6.hefe.png')
lut = amplify_lut(lut, scale=3.0)
Image.open('in.jpg').filter(lut).save('out.jpg')



: , . , ? , ( . : ).


, Pillow 5.2 16- ( ). , . 16- .


, 7 . 21 . , , . , ( 6 ), 2,5 , , . , SIMD-.


. ImageMagick GraphicsMagick. тАФ LittleCMS тАФ icc- . , , . , perf, PrelinEval8, , .



Intel Core i5-8279U.


Pillow-SIMD тАФ Pillow, x86 . 100% Pillow . , , , Pillow 5.4, Pillow-SIMD 7.0. Pillow , . .



рдЬреИрд╕рд╛ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддрдХрд┐рдпрд╛ рдореЗрдВ рд░рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬ рд╣реИ, рдФрд░ SIMD рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдордХреНрдЦрд┐рдпреЛрдВред рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдХрд╛рдлреА рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдзреАрдорд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЬрдЯрд┐рд▓рддрд╛ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдЦреЛрдЬ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреА рдУрд░, рдмрд╣реБрдореБрдЦреА рдкреНрд░рддрд┐рднрд╛, рд╕рд░рд▓рддрд╛ рдФрд░ рд╕реНрдерд┐рд░ рд╕рдордпред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрдкреАрдЖрдИ рдЖрдкрдХреЛ рд░рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд▓реНрджреА рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд┐рд▓реНрд▓реЛ-рд▓реБрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛рдо рдХрд░рдирд╛ рдФрд░ рднреА рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрддрд╛ рд╣реИред


All Articles