نمایش هیستوگرام تصویر با کمک openCV و پایتون – آموزش نحوه محاسبه هیستوگرام تصاویر : در این مقاله به تحلیل تصویر با استفاده از Matplotlib و OpenCV پرداخته شده است. میخواهیم نحوه آزمایش داده های تصویر با سبک های مختلف و نحوه نمایش با هیستوگرام را درک کنیم.
پیش نیازها:
درک از پایتون مثل متغیر ها ، لیست ها ، انواع داده ها و اضافه کردن کتابخانه ها.
شاید به مقالات زیر در ایرابرود علاقه مند باشید :
سریال های شبیه هری پاتر ، سریال های در سبک جادوگری و هری پاتر
30 تا از بهترین بازی های شوتر اول شخص برای کامپیوتر – بهترین بازی های تیراندازی
10 مورد از جالب ترین مناظر و زیبا ترین ویدیو های ضبط شده با پهپاد یا drone
محاسبه و نمایش هیستوگرام تصویر با کمک openCV و plt در پایتون و تحلیل هیستوگرام
وارد کردن داده های تصویری
تصویر باید در یک فایل PNG استفاده شود زیرا matplotlib فقط تصاویر PNG را پشتیبانی می کند. در اینجا، این یک تصویر 24 بیتی RGB PNG (8 بیت برای هر یک از R, G, B ، از آنجا که رنگ ها از ترکیب قرمز و سبز و آبی تشکیل میشوند ، تصویر هشت بیتی ما ، در هر پیکسل سه مقدار برای قرمز ، سبز و آبی قرار میگیرد. که ترکیب آنها با شدت 0 تا 255 یک رنگ برای آن پیکسل تشکیل میدهد ) است که در این مثال استفاده شده است. هر لیست سه تایی از این تصویر نشان دهنده یک پیکسل است. تصاویر RGB، matplotlib از انواع داده های float32 و uint8 پشتیبانی می کند.
import matplotlib.pyplot as plt
img = plt.imread('flower.png')
دستور بالا داده های تصویر flower را میخواند. و در یک لیست ، حاوی لیست پیکسل ها ذخیره میکند.
با دستور imshow() میتوان این تصویر را نمایش داد.
همه چیز درباره هیستوگرام – هیستوگرام در پردازش تصویر چیست ؟
هیستوگرام به عنوان نموداری در نظر گرفته می شود که به فرکانس پیکسل ها در یک تصویر مقیاس خاکستری (نوعی تصویر سیاه سفید)با مقادیر پیکسل (از 0 تا 255) مربوط می شود. تصویر در مقیاس خاکستری تصویری است که در آن مقدار هر پیکسل یک نمونه واحد است(دیگر بحث ترکیب قرمز و سبز و آبی مطرح نیست و پیکسل تنها با میزان شدت رنگ سفید بیان میشود مثلا پیکسل با مقدار 255 کاملا سفید است)، یعنی فقط حاوی اطلاعات شدت نور است که در آن مقدار پیکسل از 0 تا 255 متغیر است. تصاویری از این نوع، که به عنوان سیاه و سفید نیز شناخته میشوند، منحصراً از سایههای خاکستری، از سیاه در ضعیفترین شدت تا سفید در قویترین شدت در جایی که Pixel را میتوان به عنوان هر نقطه از یک تصویر در نظر گرفت، تشکیل میشوند.
قبل از بررسی هیستوگرام، اجازه دهید یک ایده تقریبی از این مثال ارائه شده داشته باشیم.
باکمک هیستوگرام شهودی در مورد کنتراست، روشنایی، توزیع شدت و غیره از آن تصویر دریافت می کنیم. همانطور که میتوانیم تصویر و هیستوگرام آن را ببینیم که برای تصویر خاکستری ترسیم شده است. دقت کنید که معمولا هیستوگرام برای تصاویر مقیاس خاکستری گرفته میشود ، چرا که در غیر این صورت برای هر کانال رنگی مثل سبز ، آبی و قرمز یک هیستوگرام نیاز است ، پس با سیاه سفید کردن تصویر این تعداد و هزینه را به یکی کاهش میدهیم.
نمودار عمودی سمت چپ هیستوگرام تعداد تکرار یک شدت روشنایی در تصویر و نمودار افقی پایین، درجه شدت روشنایی پیکسل های روشن تر را نشان می دهد. یعنی هرچه در نمودار افقی به سمت راست تر برویم ، نماینده ی شدت روشنایی بیشتر (سفید تر) و هرچه در نمودار عمودی بالاتر برویم ، نماینده تعداد تکرار بیشتر است. پس به صورت ساده و خلاصه ، هیستوگرام ، با کمک نمودار میله ای در آمار و احتمال ، تعداد تکرار شدت روشنایی های مختلف در یک تصویر مقیاس خاکستری را به ما نشان میدهد.
چرا هیستوگرام مهم است؟
با داشتن این اطلاعات ، میزان کنتراست ، وضوح ، روشنایی و …. را از تصویر بدست می آوریم. هرچه میله ها ، یکدست تر باشند ، وضوح تصویر بهتر است ، هرچه میان شدت های روشنایی تیر (سمت جپ نمودار افقی) و روشن (سمت راست) بالانس بیشتری وود داشته باشد ، کنتراست بالاتر است و هرچه تعداد شدت های روشنایی بیشتر بالاتر باشد ، تصویر روشنایی بیشتری دارد. این مسائل شاید به نظر مبتدی یا بی اهمیت باشند ، اما در الگوریتم های بینایی ماشین و تشخیص اشیاء بسیار با اهمیت میباشند ، برای مثال در تصویری که وضوح خوبی ندارد ، چطور میخواهید پلاک ماشین ها را تشخیص دهید ؟
ایجاد هیستوگرام با استفاده از آرایه numpy
برای ایجاد یک هیستوگرام از داده های تصویر خود، از تابع hist() استفاده می کنیم.
plt.hist(n_img.ravel(), bins=256, range=(0.0, 1.0), fc='k', ec='k')
در هیستوگرام ما، به نظر می رسد که توزیع تقریبا نامتقارنی شدت بر روی پیکسل های سیاه و سفید به عنوان تصویر در مقیاس خاکستری وجود دارد.
از هیستوگرام می توان نتیجه گرفت که ناحیه تاریک بیشتر از ناحیه روشن تر است.
اما راه حل های دیگری نیز برای محاسبه هیستوگرام وجود دارد. مثلا cv2 که در پایین آن را توضیح میدهیم.
محاسبه هیستوگرام با کمک CV2 یا opencv
در اینجا، ما از cv2.calcHist() (تابع داخلی در OpenCV) برای یافتن هیستوگرام استفاده می کنیم.
cv2.calcHist(images, channels, mask, histSize, ranges)
images: تصویر که به صورت یک متغیر ذخیره شده است. این متغیر شامل لیستی از لیست های با مقادیر unit32 یا float میباشد.
channels: ایندکس کانالی است که هیستوگرام آن را محاسبه می کنیم. برای مثال مقیاس خاکستری تنها یک کانال دارد و باید 0 به آن بدهیم ، اما rgb سه کانال دارد که هر کدام ایندکس 0 ، 1 و 2 دارند . با وارد کردن هر عدد ، هیتوگرام تنها ان کانال (مثلا هیتوگرام میزان درخشندگی رنگ سبز در تصویر) محاسبه میشود.
mask: ماسک کردن تصویر. برای یافتن هیستوگرام تصویر کامل، آن را به عنوان “None” در نظر میگیرم.
histSize: این تعداد BIN ما را نشان می دهد.یعنی تعداد میله ها، برای مقیاس کامل و در نظر داشتن کل مقدار روشنی های ممکن ، [256] را می گذاریم.
range : این محدوده درخشندگی های ما است. به طور معمول، [0,256] است.
# load an image in grayscale mode
img = cv2.imread('ex.jpg',0)
# calculate frequency of pixels in range 0-255
histg = cv2.calcHist(img,0,None,256,[0,256])
در بالا ما با کمک کتبخانه cv2 و دادن عدد 0 به تابع Imread تصویر را در مقیاس خاکستری خوانده و در متغیر Img ذخیره کردیم. عدد 0 در این کتابخانه نماد مقیاس خاکستری است. سپس با کمک تابعی که برای شما توضیح دادیم ، هیستوگرام را محاسبه میکنیم.
نحوه رسم هیستوگرام تصویر در پایتون
حال که هیستوگرام را محاسبه کردیم ، باید به نمایش هیستوگرام تصویر در پایتون بپردازیم ، تا با آنالیز آن به اطلاعاتی که نیاز داریم دست پیدا کنیم. نمایش هیستوگرام با کمک Matplotlib معروف انجام میشود:
# importing required libraries of opencv
import cv2
# importing library for plotting
from matplotlib import pyplot as plt
# reads an input image
img = cv2.imread('ex.jpg',0)
# find frequency of pixels in range 0-255
histr = cv2.calcHist([img],[0],None,[256],[0,256])
# show the plotting graph of an image
plt.plot(histr)
plt.show()
در بالا ابتدا کتابخانه های cv2 و matplotlib را به پروژه اضافه کردیم ، سپس مطابق توضیحات بالا ، هیتوگرام را محاسبه کردیم و در آخر با دو دستور plot و show نتیجه را نمایش داده ایم.
تصویر ورودی و هیستوگرام خروجی در زیر قابل مشاهده است.
حال کد روش اول را نیز امتحان میکنیم.
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('ex.jpg',0)
# alternative way to find histogram of an image
plt.hist(img.ravel(),256,[0,256])
plt.show()
که نتیجه آن در زیر قابل مشاهده است.
جوکر کیست و چگونه به وجود آمد – 10 نکته 10 مرگ و 10 پیروزی جوکر
محاسبه هیستوگرام تصاویر در پایتون – ایرابرود
0 Comments