می دانیم که کتابخانه matplotlib ، برای کار با نمودارها و ارقام است. اما اگر خواستیم یک تصویر ساده RGB را نمایش دهیم چه؟ آیا می توانیم با matplotlib انجام دهیم؟
در این قسمت مابه شما نشان می دهیم که چگونه یک تصویر RGB را با matplotlib فقط در چند خط کد میشه نشان داد و هرگونه ابهاماتی را که هنگام استفاده از OpenCV و matplotlib وقتی با هم اجرا میشوند، مواجه می شوید روشن کنید.
یک تصویر RGB، که گاهی اوقات به عنوان یک تصویر رنگی واقعی نامیده می شود، به صورت یک آرایه سه بعدی داده m × n × ۳ ذخیره می شود که کانالهای قرمز، سبز و آبی رنگ را برای هر پیکسل تعریف می کند. رنگ هر پیکسل با ترکیبی از فرمت های فایل های گرافیکی تصاویر RGB، به عنوان تصاویر ۲۴(۸*۳) بیتی ذخیره می شود، حال آنکه هر کدام از کانالهای قرمز، سبز و آبی ۸ بیت هستند.
کد زیر فقط از opencv برای خواندن و نمایش تصویر استفاده کرده است. توجه داشته باشید که فرمت رنگ پیش فرض در OpenCV BGR است (بایت ها معکوس می شوند).
import numpy as np import cv2 img = cv2.imread('test.png') cv2.imshow('opencv',img) cv2.waitKey (0) cv2.destroyAllWindows ()خروجی:
خواندن و نمایش تصویر فقط با matplotlib
در کد زیر هم فقط از matplotlib برای خواندن و نمایش تصویر استفاده شده است.
import matplotlib.pyplot as plt import matplotlib.image as mpimg image = mpimg.imread("img2.png") plt.imshow(image) plt.show()اولین کاری که ما انجام می دهیم این است که کتابخانه matplotlib را وارد کنیم.
ولی ما فقط از یک قسمتی از این کتابخانه مربوط به خواندن تصویر است به عنوان mpimg ، که جایگزین matplotlib.image، همچنین از plt که جایگزین matplotlib.pyplot است برای نمایش استفاده کردیم.
ما می توانیم تصویر زیر را ببینیم:در مورد خلاص شدن از محور و اعداد از کد زیر استفاده میکنیم:
plt.axis(“off”)plt.imshow(image)plt.show()خواندن تصویر با opencv و نمایش آن توسط matplotlib
import cv2 import matplotlib.pyplot as plt image = cv2.imread("img2.png") plt.axis("off") plt.imshow(image) plt.show()اما نتیجه انتظار نمی رفت تصویر زیر باشد:
چرا نتیجه مورد انتظار نیست؟
پاسخ به عنوان یک نکته در opencv نهفته است.
نکته
OpenCV تصاویر RGB را به عنوان آرایه های چند بعدی Numpy معرفی می کند … اما به ترتیب معکوس! به این معنی که تصاویر در واقع در BGR به جای RGB نشان داده شده است!
پس چگونه این مسئله را حل کنیم؟
تصویر را از BGR به RGB تبدیل کنیم:
تابع تبدیل ()cvtColor در OpenCv
تابع تبدیل ()cvtColor یک تصویر ورودی را از یک فضای رنگی به یکی دیگر تبدیل می کند. در صورت تغییر به-از فضای رنگ RGB، منظور از کانال ها باید صریح مشخص شود (RGB یا BGR).
cv2.cvtColor(src, code[, dst[, dstCn]]) → dst
پارامتر ها
src : تصویر ورودی:
۸-bit unsigned, 16-bit unsigned ( CV_16UC… )
dst : تصویر خروجی که اندازه و عمق آن باید مثل تصویر ورودی باشد.
code : کد تبدیل فضای رنگ
dstCn – تعداد کانال ها در تصویر مقصد؛ اگر پارامتر ۰ باشد، تعداد کانال ها به صورت خودکار از src و کد به دست می آید.
چرا در OpenCV فضای رنگ BGR است؟
توجه داشته باشید که فرمت رنگ پیش فرض در OpenCV اغلب به عنوان RGB نامیده می شود اما در واقع BGR است (بایت ها معکوس می شوند).
بنابراین بایت اول یک تصویر استاندارد ۲۴ بیتی، ۸ بیتی، آبی ، بایت دوم سبز و بایت سوم قرمز خواهد بود. بایت های چهارم، پنجم و ششم پیکسل دوم (آبی، سپس سبز، سپس قرمز)، و غیره
محدوده معمول برای مقادیر کانال R، G و B عبارتند از:
۰ to 255 for CV_8U images
۰ to 65535 for CV_16U images
۰ to 1 for CV_32F images
CV_8U – یعنی یک پیکسل می تواند مقادیر ۰-۲۵۵ داشته باشد، این محدوده طبیعی برای اکثر فرمت های تصویری و فیلم است.
CV_32F – پیکسل می تواند هر مقدار بین ۰-۱٫۰ داشته باشد، برای برخی از مجموعه محاسبات در داده ها مفید است – اما باید آن را به ۸ بیت برای ذخیره یا نمایش با ضرب کردن هر پیکسل به ۲۵۵ تبدیل کنید.
CV_8U: یک عدد صحیح بدون علامت ۱ بایت (unsigned char).
CV_32S عدد صحیح علامت دار (int).
CV_32F: نقطه شناور ۴ بایت.import numpy as np import matplotlib.pyplot as plt import cv2 img = cv2.imread('img2.png') temp = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.imshow(temp) plt.axis('off') plt.show()نتیجه اسکریپت ما نشان می دهد که رنگ های تصویر ما درست است.