تحويل اللون: عمليات البحث في جدول التخفيف

هذه نظرة عامة على الوظائف المقدمة في الوسادة 5.2 : استخدام جداول البحث ثلاثية الأبعاد (3D LUTs) لتحويل اللون. هذه التقنية منتشرة على نطاق واسع في معالجة الفيديو والألعاب ثلاثية الأبعاد ، ولكن القليل من المكتبات الرسومية يمكن أن تتباهى بتحويلات 3D LUT قبل ذلك.


توفر جداول البحث ثلاثية الأبعاد مرونة كبيرة في وصف تحويلات الألوان ، ولكن الأهم من ذلك ، يتم تنفيذ التحويلات في نفس الوقت ، بغض النظر عن مدى تعقيدها.


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

تنطبق ميزة مكتوبة بالكامل في Python على صورة بدقة 16.6 ميجابكسل في 75 مللي ثانية.



العمل مع الصور يتطلب الكثير من الموارد بالفعل ، لذلك أحب الخوارزميات التي تزيل التعقيد من معلمات الإدخال. قبل خمس سنوات ، قمت بتطبيق ضبابية غوسية في وسادة ، وعملت في نفس الوقت لأي دائرة نصف قطرها. منذ وقت ليس ببعيد ، تحدثت عن كيفية تقليل الصورة في وقت ثابت مع الحد الأدنى من فقدان الجودة. اليوم سأوضح لك المهام التي يمكنك استخدام 3D LUT لها ، وما هي قيودها ، وأنا أتفاخر بالأداء المحقق في Pillow-SIMD.


افعلها بشكل طبيعي - لن تكون طبيعية


: , . - , ( 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 تطير إلى الفضاء. يجب أن أقول أن هذا يمكن أن يكون أبطأ من التنفيذ الأمثل جيدًا لعدد كبير إلى حد ما من التحولات التي يمكن كتابتها في C. ولكن على جانب جداول البحث ، تعددية الاستخدامات والبساطة والوقت المستقر ، بغض النظر عن عدد وتعقيد التحولات. تسمح لك واجهة برمجة التطبيقات البسيطة بالبدء بسرعة في استخدام تحويلات الألوان ، كما أن مكتبة وسادة خاصة تجعل العمل أكثر سهولة.


All Articles