چشم انداز کامپیوتر 101: کار با تصاویر رنگی در پایتون

منبع: pexels.com

چشم انداز کامپیوتر 101: کار با تصاویر رنگی در پایتون

اصول کار با تصاویر RGB و آزمایشگاه را برای تقویت پروژه های بینایی رایانه خود بیاموزید!

هر پروژه بینایی رایانه ای - چه طبقه بندی گربه/سگ باشد یا رنگ بیاورد به تصاویر/فیلم های قدیمی - شامل کار با تصاویر می شود. و در نهایت ، مدل فقط می تواند به خوبی داده های زیر باشد - زباله داخل ، زباله بیرون. به همین دلیل است که در این پست بر توضیح اصول اولیه کار با تصاویر رنگی در پایتون ، نحوه نمایش آنها و نحوه تبدیل تصاویر از یک نمایش رنگی به دیگری متمرکز می شوم.

راه اندازی

< p> در این قسمت ، محیط پایتون را راه اندازی می کنیم. ابتدا همه کتابخانه های مورد نیاز را وارد می کنیم: از skimage.io import imread ، imshow
 import matplotlib.pyplot as plt 

ما از scikit-image استفاده می کنیم ، که کتابخانه ای از خانواده scikit-learn است که بر کار با تصاویر تمرکز دارد. روش های جایگزین زیادی وجود دارد ، برخی از کتابخانه ها شامل matplotlib ، numpy ، OpenCV ، Pillow و غیره هستند.

در مرحله دوم ، ما یک تابع کمکی برای چاپ خلاصه ای از اطلاعات در مورد تصویر - شکل و محدوده مقادیر در هر یک از لایه ها.

منطق تابع بسیار ساده است و برش ابعاد به محض توضیح نحوه ذخیره تصاویر معنا پیدا می کند.

مقیاس خاکستری

ما با ابتدایی ترین حالت ممکن ، یک تصویر مقیاس خاکستری شروع می کنیم. چنین تصاویری منحصراً از سایه های خاکستری ساخته شده است. رنگهای افراطی سیاه (ضعیف ترین کنتراست) و سفید (قوی ترین شدت) هستند. به مقیاس مقادیر برای تصاویر در مقیاس خاکستری از 0 (سیاه) تا 255 (سفید) متغیر است. تصویر زیر یک نمای کلی از مفهوم را ارائه می دهد.

منبع

در این مقاله ، ما با تصویری که قبلاً به عنوان تصویر کوچک ، دایره مداد رنگی های رنگارنگ دیدید کار می کنیم. تصادفی نبود که چنین تصویر رنگی انتخاب شد :)

ما با بارگذاری تصویر مقیاس خاکستری در پایتون و چاپ آن شروع می کنیم.

 image_gs = imread ('crayons.jpg' ، as_gray = True) 
 fig، ax = plt. subplots (figsize = (9، 16))
imshow (image_gs ، ax = ax)
ax.set_title ("تصویر مقیاس خاکستری")
ax.axis ('خاموش') ؛ 

از آنجا که تصویر اصلی رنگی است ، از as_gray = True برای بارگذاری آن به عنوان تصویر مقیاس خاکستری استفاده کردیم. از طرف دیگر ، می توانیم تصویر را با استفاده از تنظیمات پیش فرض imread بارگذاری کنیم (که یک تصویر RGB را بارگذاری می کند - که در قسمت بعدی آمده است) و با استفاده از تابع rgb2gray آن را به مقیاس خاکستری تبدیل کنیم.

در مرحله بعد ، کمکی را اجرا می کنیم. برای چاپ خلاصه تصویر.

 print_image_summary (image_gs، ['G']) 

اجرای کد خروجی زیر را تولید می کند: ------------ جزئیات تصویر: -------------- ابعاد تصویر: (1280 ، 1920) کانال ها: G: min = 0.0123 ، max = 1.0000

تصویر به عنوان یک ماتریس دو بعدی ، 1280 ردیف در ستون 1920 (وضوح وضوح بالا) ذخیره می شود. با مشاهده مقادیر حداقل و حداکثر ، می بینیم که آنها در محدوده [0،1] هستند. به این دلیل که آنها به طور خودکار بر 255 تقسیم می شوند ، که یک مرحله پیش پردازش معمول برای کار با تصاویر است.

RGB

اکنون زمان کار با رنگ ها فرا رسیده است. ما با مدل RGB شروع می کنیم. به طور خلاصه ، این یک مدل افزودنی است که در آن سایه هایی ازقرمز ، سبز و آبی (از این رو نام آن) به نسبتهای مختلف به هم اضافه می شوند تا طیف وسیعی از رنگها را تولید کنند.

در scikit-image ، این مدل پیش فرض برای بارگذاری تصاویر با استفاده از imread است:

 image_rgb = imread ('crayons.jpg') 

قبل از چاپ تصاویر ، بیایید خلاصه را بررسی کنیم تا نحوه ذخیره سازی تصویر در پایتون را درک کنیم.

 print_image_summary (image_rgb، ['R'، 'G'، 'B']) 

اجرای کد خلاصه زیر را ایجاد می کند:

 ----------- ---
جزئیات تصویر:
--------------
ابعاد تصویر: (1280 ، 1920 ، 3)
کانال ها:
R: دقیقه = 0.0000 ، حداکثر = 255.0000
G: دقیقه = 0.0000 ، حداکثر = 255.0000
B: min = 0.0000 ، max = 255.0000 

در مقایسه با تصویر مقیاس خاکستری ، این بار تصویر به صورت 3D np.ndarray ذخیره می شود. بعد اضافی هر یک از 3 کانال رنگی را نشان می دهد. مانند قبل ، شدت رنگ در مقیاس 0-255 ارائه شده است. اغلب به دامنه [0،1] تغییر می یابد. سپس ، مقدار پیکسل 0 در هر یک از لایه ها نشان می دهد که هیچ رنگی در آن کانال خاص برای آن پیکسل وجود ندارد.

یک نکته مفید: هنگام استفاده از عملکرد imread OpenCV ، تصویر به عنوان BGR بارگیری می شود. به جای RGB برای سازگاری آن با کتابخانه های دیگر ، باید ترتیب کانال ها را تغییر دهیم.

زمان چاپ تصویر و کانال های رنگی مختلف فرا رسیده است:

 fig، ax = plt . subplots (1 ، 4 ، figsize = (18 ، 30)) 
 ax [0] .imshow (image_rgb/255.0)
ax [0] .axis ("خاموش")
ax [0] .set_title ('RGB اصلی') 
 for i، lab in enumerate (['' R '،' G '،' B ']، 1):
    temp = np.zeros (image_rgb.shape)
    temp [:،:، i - 1] = image_rgb [:،:، i - 1]
    ax [i] .imshow (temp/255.0)
    ax [i] .axis ("خاموش")
    ax [i] .set_title (lab) 
 plt.show () 

در تصویر زیر می توانیم تصویر اصلی و 3 کانال رنگی را جداگانه مشاهده کنیم. آنچه در مورد این تصویر دوست دارم این است که با تمرکز روی مداد رنگی ، می توانیم ببینیم کدام رنگ از کانال های RGB و در چه نسبت هایی رنگ نهایی را در تصویر اصلی ایجاد می کند.

متناوبا ، ما می توانیم کانال های رنگی جداگانه را به صورت زیر ترسیم کنیم:

 fig، ax = plt.subplots (1 ، 4 ، figsize = (18 ، 30)) 
 ax [0] .imshow (image_rgb)
ax [0] .axis ("خاموش")
ax [0] .set_title ('RGB اصلی') 
 برای i ، cmap in enumerate ([[قرمزها ، سبزها ، آبی ها]]):
    ax [i+1] .imshow (image_rgb [:،:، i]، cmap = cmap)
    ax [i+1] .axis ("خاموش")
    ax [i+1] .set_title (cmap [0]) 
 plt.show () 

چه چیزی خروجی زیر را تولید می کند:

آنچه که من در مورد این نوع ترسیم کانالهای RGB ترجیح می دهم این است که تشخیص آنها آسان تر است رنگهای مختلف (به دلیل روشن و شفاف بودن سایرین) و شدت آنها بیشتر برجسته می شوند. هنگام استفاده از شبکه های عصبی کانولوشنال (CNN) برای آن کار ، باید همه عملیات را روی هر 3 کانال رنگی اعمال کنیم. در این مقاله ، نحوه استفاده از CNN ها برای کار با مشکل طبقه بندی تصویر باینری را نشان می دهم.

آزمایشگاه

در کنار RGB ، یکی دیگر از روش های رایج برای نمایش تصاویر رنگی استفاده از رنگ آزمایش است. space (همچنین به عنوان CIELAB شناخته می شود).

قبل از پرداختن به جزئیات بیشتر ، منطقی است که تفاوت بین مدل رنگ و فضای رنگ را مشخص کنید. مدل رنگ یک روش ریاضی برای توصیف رنگ ها است. فضای رنگ روش نگاشت رنگهای واقعی و قابل مشاهده بر روی مقادیر گسسته مدل رنگ است. برای جزئیات بیشتر ، لطفاً به این پاسخ مراجعه کنید.(سیاه) تا 100 (سفید) ، که در واقع یک تصویر در مقیاس خاکستری است a: طیف رنگ سبز -قرمز ، با مقادیر مختلف از -128 (سبز) تا 127 (قرمز) < uli> b: طیف رنگ آبی -زرد ، با مقادیر از -128 (آبی) تا 127 (زرد)

به عبارت دیگر ، آزمایش تصویر را در یک لایه مقیاس خاکستری کد می کند و سه لایه رنگ را به دو تقسیم می کند. .

با تبدیل تصویر از RGB به آزمایشگاه و چاپ خلاصه تصویر شروع می کنیم:

 image_lab = rgb2lab (image_rgb/255) 

تابع rgb2lab فرض می کند که RGB به مقادیر بین 0 تا 1 استاندارد شده است ، به همین دلیل است که همه مقادیر را بر 255 تقسیم می کنیم. از خلاصه زیر ، می بینیم که دامنه مقادیر آزمایشگاه در مقادیر ذکر شده در بالا قرار می گیرد.

- -------------
جزئیات تصویر:
--------------
ابعاد تصویر: (1280 ، 1920 ، 3)
کانال ها:
L: دقیقه = 0.8618 ، حداکثر = 100.0000
a: min = -73.6517 ، حداکثر = 82.9795
b: min = -94.7288 ، max = 91.2710 

در مرحله بعد ، تصویر را تجسم می کنیم-آزمایشگاه و هر یک از کانال ها به طور جداگانه.

 fig، ax = plt. subplots (1 ، 4 ، figsize = (18 ، 30)) 
 ax [0] .imshow (image_lab)
ax [0] .axis ("خاموش")
ax [0] .set_title ('Lab') 
 for i، col in enumerate (['' L '،' a '،' b ']، 1):
    imshow (image_lab [:،:، i-1]، ax = ax [i])
    ax [i] .axis ("خاموش")
    ax [i] .set_title (col) 
 fig.show () 
اولین تلاش برای ترسیم تصویر آزمایشگاه

خوب ، اولین تلاش برای تجسم فضای رنگ آزمایشگاه بسیار موفق نبود. اولین تصویر تقریباً غیرقابل تشخیص است ، لایه L در مقیاس خاکستری نیست. پس از درک این پاسخ ، برای چاپ صحیح ، مقادیر آزمایشگاه باید در محدوده [0،1] افزایش یابد. این بار ، لایه اول متفاوت از دو لایه اخیر است.

#مقیاس تصویر آزمایشگاه
image_lab_scaled = (image_lab + [0، 128، 128])/[100، 255، 255] 
 fig، ax = plt. subplots (1، 4، figsize = (18، 30)) 
 ax [0] .imshow (image_lab_scaled)
ax [0] .axis ("خاموش")
ax [0] .set_title ('Lab scaled') 
 for i، col in enumerate (['' L '،' a '،' b ']، 1):
    imshow (image_lab_scaled [:،: ، i-1] ، ax = ax [i])
    ax [i] .axis ("خاموش")
    ax [i] .set_title (col)
    
fig.show () 

تلاش دوم بسیار بهتر است. در اولین تصویر ، نمایش آزمایشگاه تصویر رنگی را مشاهده می کنید. این بار ، لایه L یک تصویر واقعی در رنگ خاکستری است. آنچه هنوز می تواند بهبود یابد دو لایه آخر است ، زیرا در مقیاس خاکستری نیز وجود دارد.

دومین تلاش برای ترسیم تصویر آزمایشگاه

در آخرین تلاش ، نقشه های رنگی را به لایه های a و b تصویر آزمایشگاه اعمال می کنیم.

 fig، ax = plt.subplots (1 ، 4 ، figsize = (18 ، 30)) 
 ax [0] .imshow (image_lab_scaled)
ax [0] .axis ("خاموش")
ax [0] .set_title ("آزمایشگاه مقیاس بندی شده") 
 imshow (image_lab_scaled [:،:، 0]، ax = ax [1])
ax [1] .axis ("خاموش")
ax [1] .set_title ('L') 
 ax [2] .imshow (image_lab_scaled [:،،: 1]، cmap = 'RdYlGn_r')
ax [2] .axis ("خاموش")
ax [2] .set_title ('a') 
 ax [3] .imshow (image_lab_scaled [:،،: 2]، cmap = 'YlGnBu_r')
ax [3] .axis ("خاموش")
ax [3] .set_title ('b')
    
plt.show () 

این بار نتایج رضایت بخش است. ما می توانیم رنگهای مختلف را در لایه های a و b به وضوح تشخیص دهیم. آنچه هنوز می تواند بهبود یابد ، خود نقشه ها هستند. برای سادگی ، از نقشه های رنگ از پیش تعریف شده استفاده کردم ، که حاوی رنگی بین دو رنگ فوق العاده است (زرد برای لایه a ، سبز در لایه b). یک راه حل بالقوه کدگذاری نقشه های رنگی است.

سومین تلاش برای ترسیم تصویر آزمایشگاه

معمولاً هنگام کار با مشکلات رنگ آمیزی تصویر ، مانند DeOldify معروف ، با تصاویر آزمایشگاهی روبرو می شوید.

نتیجه گیری

در این مقاله ، رفتم اصول کار با تصاویر رنگی در پایتون با استفاده از تکنیک های ارائه شده ، می توانید به تنهایی کار روی مشکل بینایی رایانه را شروع کنید. من معتقدم درک آن مهم استنحوه ذخیره سازی تصاویر و نحوه تبدیل آنها به نمایش های مختلف ، به طوری که هنگام آموزش شبکه های عصبی عمیق با مشکلات غیرمنتظره روبرو نشوید.

یکی دیگر از فضاهای رنگی محبوب XYZ است. scikit-image همچنین دارای عملکردهایی برای تبدیل تصاویر RGB یا آزمایشگاه به XYZ است.

می توانید کد مورد استفاده برای این مقاله را در GitHub من بیابید. مثل همیشه ، از هر گونه بازخورد سازنده استقبال می شود. می توانید در توییتر یا نظرات با من تماس بگیرید.

من اخیراً کتابی درباره استفاده از پایتون برای حل وظایف عملی در حوزه مالی منتشر کرده ام. اگر علاقه دارید ، مقاله ای را معرفی کردم که به معرفی مطالب کتاب پرداخت. می توانید کتاب را در وب سایت آمازون یا Packt دریافت کنید.

منابع

[1] https://ai.stanford.edu/~syyeung/cvweb/tutorial1.html

[2] https://github.com/scikit-image/scikit-image/issues/1185

نظرات 0 + ارسال نظر
برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد