PIL في بيثون من السهل إلى الصعب

للوصول إلى خوارزميات المعالجة المعقدة ، يجدر تحليل المخططات القياسية ، والتي أقترح البدء بها.

لمعالجة الأمثلة ، سيتم استخدام صورة بها مجموعات مختلفة من الألوان:

صورة

للبدء ، نحتاج إلى وحدتي مكتبة:

from PIL import Image, ImageDraw 

إعداد أدوات للعمل المستقبلي المريح:

 image = Image.open('test.jpg') #   draw = ImageDraw.Draw(image) #     width = image.size[0] #   height = image.size[1] #   pix = image.load() #    

لنبدأ


سنقوم بمعالجة الصور بتنسيق RGB. يدعم PIL أيضًا العمل بالتنسيقات 1 و L و P و RGB و RGBA و CMYK و YCbCr و LAB و HSV و I و F.

يتم تعيين قيم البيكسل في الصورة بالتنسيق: (س ، ص) ، (أحمر ، أخضر ، أزرق) ، حيث x ، ص هي الإحداثيات ، والقيم العددية ل RGB في النطاق من 0 إلى 255. وهذا هو ، ونحن نعمل مع صورة 8 بت.

ظلال رمادية


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

 for x in range(width): for y in range(height): r = pix[x, y][0] #     g = pix[x, y][1] # b = pix[x, y][2] # sr = (r + g + b) // 3 #  draw.point((x, y), (sr, sr, sr)) #  image.save("result.jpg", "JPEG") #    

صورة
فارق بسيط
ترى العين البشرية مجموعة مختلفة من الألوان بطرق مختلفة. لن يمنحك أي شخص الصيغة الدقيقة ، نظرًا لأن إدراك الألوان مختلف لكل شخص بطريقة أو بأخرى ، ولكن إذا كنت مهتمًا ، يمكنك قراءة المزيد هنا وهنا .


انقلاب


يتم الحصول على الانعكاس بطرح اللون الحالي من 255:

 for x in range(width): for y in range(height): r = pix[x, y][0] g = pix[x, y][1] b = pix[x, y][2] draw.point((x, y), (255 - r, 255 - g, 255 - b)) 

صورة

انعكاس تدرج الرمادي


الجمع بين الخوارزميات السابقة ، يمكنك كتابة التعليمات البرمجية التالية:

 for x in range(width): for y in range(height): r = pix[x, y][0] g = pix[x, y][1] b = pix[x, y][2] sr = (r + g + b) // 3 draw.point((x, y), (255 - sr, 255 - sr, 255 - sr)) 

صورة

انعكاس تدرج الرمادي الانتقائي


بالنسبة إلى هذه الخوارزمية ، يلزمك تحديد قيمة العتبة ، والتي سآخذها مقابل 100:

 for x in range(width): for y in range(height): r = pix[x, y][0] g = pix[x, y][1] b = pix[x, y][2] if (r+g+b)>100: #    100 ,    sr = (r + g + b) // 3 draw.point((x, y), (255-sr, 255-sr, 255-sr)) else: #    sr = (r + g + b) // 3 draw.point((x, y), (sr, sr, sr)) 

صورة

استنتاج


في المقالات التالية ، أود أن أتحدث عن كيفية التعامل مع تصفية الصور محليًا بتقسيمها إلى مناطق ، بالإضافة إلى إظهار إمكانيات DFS المثيرة للاهتمام في خوارزميات معالجة الصور

Source: https://habr.com/ru/post/ar451074/


All Articles