Transformasi Warna: Penipisan Tabel Pencarian

Ini adalah gambaran umum fungsionalitas yang diperkenalkan pada Pillow 5.2 : penggunaan tabel pencarian tiga dimensi (3D LUT) untuk transformasi warna. Teknik ini tersebar luas dalam pemrosesan video dan game 3D, tetapi beberapa perpustakaan grafis bisa membanggakan transformasi LUT 3D sebelum itu.


Tabel pencarian tiga dimensi memberikan fleksibilitas besar dalam menggambarkan transformasi warna, tetapi yang paling penting, transformasi dilakukan dalam waktu yang sama, tidak peduli seberapa kompleksnya mereka.


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))

Fitur yang sepenuhnya ditulis dalam Python berlaku untuk gambar 16,6 megapiksel dalam 75ms.



Bekerja dengan gambar sudah intensif sumber daya, jadi saya suka algoritma yang menghilangkan kompleksitas dari parameter input. Lima tahun yang lalu, saya menerapkan Gaussian blur at Pillow , bekerja pada waktu yang sama untuk radius apa pun. Belum lama ini, saya berbicara tentang bagaimana Anda dapat mengurangi gambar dalam waktu yang konstan dengan kehilangan kualitas minimal. Hari ini saya akan menunjukkan kepada Anda tugas apa yang dapat Anda gunakan dengan 3D LUT, untuk apa batasannya dan saya membual tentang kinerja yang dicapai dalam Pillow-SIMD.


Lakukan secara normal - itu tidak akan normal


: , . - , ( 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 , . .



Seperti yang dapat dilihat dari hasil tes, transformasi warna pada Bantal lebih cepat dari solusi yang ada, dan dengan penggunaan instruksi SIMD terbang ke angkasa. Saya harus mengatakan bahwa ini masih bisa lebih lambat daripada implementasi yang dioptimalkan dengan baik dari sejumlah besar transformasi yang dapat ditulis dalam C. Tetapi di sisi tabel pencarian, keserbagunaan, kesederhanaan dan waktu yang stabil, terlepas dari jumlah dan kompleksitas transformasi. API sederhana memungkinkan Anda untuk mulai menggunakan transformasi warna dengan cepat, dan perpustakaan Pillow-lut khusus membuatnya lebih mudah untuk bekerja.


All Articles