نوشته‌ها

image -processing-python-opencv

نمایش تصویرRGB با Matplotlib و تابع تبدیل ()cvtColor در OpenCv

.

۱- نمایش تصویرRGB با Matplotlib
۱- ۲خواندن و نمایش تصویر فقط با opencv
۱- ۳خواندن و نمایش تصویر فقط با matplotlib
۱- ۴ خواندن تصویر با opencv و نمایش آن توسط matplotlib
۲- تابع تبدیل ()cvtColor در OpenCv

 

 


نمایش تصویرRGB با Matplotlib

 


می دانیم که کتابخانه  matplotlib ، برای کار با نمودارها و ارقام است. اما اگر خواستیم یک تصویر ساده RGB را نمایش دهیم چه؟ آیا می توانیم با matplotlib انجام دهیم؟

در این قسمت مابه شما نشان می دهیم که چگونه یک تصویر RGB  را با matplotlib فقط در چند خط کد  میشه نشان داد و هرگونه ابهاماتی را که هنگام استفاده از OpenCV و matplotlib وقتی با هم اجرا میشوند، مواجه می شوید روشن کنید.

یک تصویر RGB، که گاهی اوقات به عنوان یک تصویر رنگی واقعی نامیده می شود، به صورت یک آرایه سه بعدی  داده m × n × ۳ ذخیره می شود که کانالهای قرمز، سبز و آبی رنگ را برای هر پیکسل تعریف می کند. رنگ هر پیکسل با ترکیبی از فرمت های فایل های گرافیکی تصاویر RGB، به عنوان تصاویر ۲۴(۸*۳) بیتی ذخیره می شود، حال آنکه هر کدام از کانالهای قرمز، سبز و آبی ۸ بیت هستند.

 

نمایش تصویرRGB توسط Matplotlib

تصویر اصلی

 

خواندن و نمایش تصویر فقط با opencv

کد زیر فقط از opencv برای خواندن و نمایش تصویر استفاده  کرده است. توجه داشته باشید که فرمت رنگ پیش فرض در OpenCV  BGR است (بایت ها معکوس می شوند).

import numpy as np
import cv2
img = cv2.imread('test.png')
cv2.imshow('opencv',img)
cv2.waitKey (0)
cv2.destroyAllWindows ()

خروجی:

نمایش تصویر با استفاده از opencv

نمایش تصویر با استفاده از opencv

 

خواندن و نمایش تصویر فقط با 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 است  برای نمایش استفاده کردیم.
ما می توانیم تصویر زیر را ببینیم:

 

نمایش تصویر با استفاده از matplotlib با محور دور تصویر

نمایش تصویر با استفاده از matplotlib با محور دور تصویر

در مورد خلاص شدن از محور  و اعداد از کد زیر استفاده میکنیم:

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 و نمایش آن توسط matplotlib

خواندن تصویر با opencv و نمایش آن توسط matplotlib

 

چرا نتیجه مورد انتظار نیست؟

پاسخ به عنوان یک نکته در opencv نهفته است.

 

نکته

OpenCV تصاویر RGB را به عنوان آرایه های چند بعدی Numpy معرفی می کند … اما به ترتیب معکوس! به این معنی که تصاویر در واقع در BGR به جای RGB نشان داده شده است!

پس چگونه این مسئله را حل کنیم؟

 

 تصویر را از BGR به RGB   تبدیل   کنیم:


تابع تبدیل ()cvtColor در OpenCv 


این تابع یک تصویر ورودی را از یک فضای رنگی به یکی دیگر تبدیل می کند.  در صورت تغییر به-از فضای رنگ 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 است (بایت ها معکوس می شوند).

  بنابراین بایت اول یک تصویر استاندارد ۲۴ بیتی،  8 بیتی،  آبی ، بایت دوم سبز  و بایت سوم قرمز خواهد بود. بایت های چهارم، پنجم و ششم پیکسل دوم (آبی، سپس سبز، سپس قرمز)، و غیره

محدوده  معمول برای مقادیر کانال 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()

 

نتیجه اسکریپت ما نشان می دهد که رنگ های تصویر ما درست است.

 



۱-پردازش تصویر با پایتون-OpenCV
۲-آموزش نصب pip در پایتون
۳-
کتابخانه های مورد نیاز پردازش تصویر
۴ – خواندن و نمایش فرمت تصویر در پایتون
۵- نمایش تصویرRGB با Matplotlib و تابع تبدیل ()cvtColor در OpenCv

۶-تغییر فضاهای رنگ- opencv

۷-تقسیم و ادغام کانال های تصویری با opencv

۸-بخشبندی تصویر (Image Segmentation)

۹-آستانه گذاری ساده


آموزش قبلی

https://sufra.ir/2017/12/%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D8%B4-%D8%AA%D8%B5%D9%88%DB%8C%D8%B1%D8%A8%D8%A7-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86/

 

آموزش بعدی

 

 

Histogram in OpenCv

 هیستوگرام در پردازش تصویر

۱- نمودار هیستوگرام چیست؟
۱-۲- هیستوگرام برای تصاویر رنگی
۱-۳- متعادل سازی هیستوگرام


 نمودار هیستوگرام چیست؟

هیستوگرام یا بافت‌نگار به نموداری گفته می‌شود که فراوانی عناصری که در محور افقی آن قرار دارند را در محور عمودی نشان می‌دهد. ویکی

تصویر زیر یک ماتریس دو بعدی از یک تصویر است که که حاوی اطلاعات از شدت روشنایی است .اگر فرض کنیم، تعداد پیکسلهایی که شدت روشنایی مثلا ۰ دارند ۱۰ تا است، ۱۰ را در محور y و محدوده شدت روشنایی(۰ یا سیاه) را درمحور x نشان میدهد.
یک هیستوگرام  مجموعه ای از مناطق مستطیل شکل یا استوانه ای به نام سطل(bin) است. (تعریف دیگر)

 

هیستوگرام 

https://docs.opencv.org

اگر بخواهیم این داده ها را به صورت سازمان یافته ببینیم  باید چه کنیم؟ با توجه به اینکه محدوده ارزش اطلاعات برای این مورد ۲۵۶ مقدار است، میتوانیم محدوده را به بخشهایی مثل سطل(bins) تقسیم کنیم:

\begin{array}{l} [0, 255] = { [0, 15] \cup [16, 31] \cup ....\cup [240,255] } \\ range = { bin_{1} \cup bin_{2} \cup ....\cup bin_{n = 15} } \end{array}

 

بنابراین  می توانیم تعداد پیکسل هایی را که در محدوده هر سطل قرار می گیرند، نگهداریم. برای تصویر بالا، تصویر زیر آماده شده است. محور x همان سطل ها و محور y تعداد پیکسل.

Histogram

Histogram

این یک مثال ساده از نحوه عملکرد هیستوگرام و دلیل مفید بودن آن است. هیستوگرام می تواند نه تنها از شدت های رنگ،  بلکه از ویژگی های تصویری که می خواهیم اندازه گیری کنیم (مانند شیب، جهت ها و غیره) باشد. 

بیایید برخی ورودی های تابع  هیستوگرام را شناسایی کنیم:

  • dims: تعداد پارامترهایی که می خواهید اطلاعات را جمع آوری کنید. در مثال ما مقدار این پارامتر ۱ است. چون فقط مقدار شدت روشنایی را در نظر گرفتیم. 
  • bins : تعداد هر مستطیل یا سطل را مشخص میکند. در این مثال bins = 16
  • range: بازه ای از مقادیر [range = [0,255

اگر می خواهید دو ویژگی را حساب کنید چه؟ در این حالت نتیجه شما یک قطعه ۳D است. همین کار را برای ویژگی های بیشتر اعمال می کند (مطمئنا پیچیده تر می شود).

در تمام قسمت ها از تصویر زیر به عنوان ورودی استفاده شده است:

Histogram

تصویر اصلی

import cv2
import numpy as np
from matplotlib import pyplot as plt

gray_img = cv2.imread('images_histogram.png', cv2.IMREAD_GRAYSCALE)#histogram tasvir tak kanale
cv2.imshow('GoldenGate',gray_img)
hist = cv2.calcHist([gray_img],[0],None,[256],[0,256])
plt.hist(gray_img.ravel(),256,[0,256])
plt.title('Histogram for gray scale picture')
plt.show()

while True:
    k = cv2.waitKey(0) & 0xFF     
    if k == 27: break             # ESC key to exit 
cv2.destroyAllWindows()

hisgray

image_histogram

image_histogram

نکته: نحوه کارکرد تابع ()ravel, همانند (reshape(-1.

 import numpy as np
 x = np.array([[1, 2, 3], [4, 5, 6]])
print (np.ravel(x))
[۱ ۲ ۳ ۴ ۵ ۶]
 x.reshape(-1)
array([1, 2, 3, 4, 5, 6])

()calcHist

OpenCV از  تابع ()cv2.calcHist  برای هیستوگرام استفاده میکند. بنابراین، زمان آن است که به پارامترهای خاص مربوط به تابع () cv2.calcHist نگاه کنیم:

cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])

ما به صورت زیر استفاده کردیم:

hist = cv2.calcHist([gray_img],[0],None,[256],[0,256])

پارامتر ها

  1. images: تصویر منبع از نوع uint8 یا float32، باید به عنوان یک لیست ارائه شود. [gray_img]
  2. channels: این مورد نیز به عنوان یک لیست [] داده شده است. این شاخص کانال است که ما با آن هیستوگرام را محاسبه می کنیم. برای مثال، اگر ورودی تصویر سیاه و سفید است، مقدار آن [۰] است. برای تصویر رنگی، می توانید [۰]، [۱] یا [۲] را به ترتیب برای هیستوگرام کانال آبی، سبز یا قرمز محاسبه کنید.
  3. mask:  برای پیدا کردن هیستوگرام  تصویرکامل ، آن را به عنوان None تنظیم شده است. با این حال، اگر ما می خواهیم هیستوگرام منطقه خاص تصویر را دریافت کنیم، باید یک تصویر ماسک برای آن ایجاد کنیم و آن را ماسک کنیم.
  4. histSize:  نشان دهنده شمارش BIN است. باید در [] داده شود. برای مقیاس کامل، ما [۲۵۶]را قرار دادیم .
  5. ranges : به طور معمول، [۰،۲۵۶] است.

 

()NumPy – np.histogram

 

همچنین NumPy یک تابع برای هیستوگرام، که ()np.histogram  است  را فراهم می کند. بنابراین، ما می توانیم به جای تابع OpenCV از NumPy استفاده کنیم:

import cv2
import numpy as np
from matplotlib import pyplot as plt

gray_img = cv2.imread('hisimage.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('GoldenGate',gray_img)
#hist = cv2.calcHist([gray_img],[0],None,[256],[0,256])
hist,bins = np.histogram(gray_img,256,[0,256])

plt.hist(gray_img.ravel(),256,[0,256])
plt.title('Histogram for gray scale picture')
plt.show()

while True:
    k = cv2.waitKey(0) & 0xFF     
    if k == 27: break             # ESC key to exit
cv2.destroyAllWindows()

هیستوگرام برای تصاویر رنگی

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('images/GoldenGateSunset.png', -1)
cv2.imshow('GoldenGate',img)

color = ('b','g','r')
for channel,col in enumerate(color):
    histr = cv2.calcHist([img],[channel],None,[256],[0,256])
    plt.plot(histr,color = col)
    plt.xlim([0,256])
plt.title('Histogram for color scale picture')
plt.show()

while True:
    k = cv2.waitKey(0) & 0xFF     
    if k == 27: break             # ESC key to exit 
cv2.destroyAllWindows()
his-color-image

هیستوگرام برای تصاویر رنگی


متعادل سازی هیستوگرام

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

یک تصویر را که مقادیر پیکسل(شدت روشنایی) آن،  به رنج کمی از مقادیر،  محدود است را در نظر بگیرید. برای مثال، تصویر روشن تر تمام پیکسل ها را به مقادیر بالا(نزدیک به ۲۵۵) محدود خواهد کرد. اما یک تصویر خوب، پیکسل ها را از تمام نقاط تصویر انتخاب میکند.

بنابراین باید این هیستوگرام را به هر دو انتها ببرید ( تصویر زیر از ویکیپدیا داده شده است) و این همان کاری است که متعادل سازی  هیستوگرام می کند (به صورت ساده).

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

histogram_equalization

متعادل سازی هیستوگرام

importcv2
import numpy as  np
from matplotlib import pyplot as plt
img = cv2.imread('wiki.jpg',0)
hist,bins = np.histogram(img.flatten(),256,[0,256])
cdf = hist.cumsum()
cdf_normalized = cdf * hist.max()/ cdf.max()
plt.plot(cdf_normalized, color = 'b')
plt.hist(img.flatten(),256,[0,256], color = 'r')
plt.xlim([0,256])
plt.legend(('cdf','histogram'), loc = 'upper left')
plt.show()

در تصوير، مقدار ميانگين مقدار متوسط شدت روشنايی تصوير را نشان می دهد و مقدار واريانس، مقدار متوسط کنتراست تصوير را نمايش می دهد.

 🆔@image_Process
🌐https://t.me/image_Process


۱-پردازش تصویر با پایتون-OpenCV
۲-آموزش نصب pip در پایتون
۳-
کتابخانه های مورد نیاز پردازش تصویر
۴ – خواندن و نمایش فرمت تصویر در پایتون
۵- نمایش تصویرRGB با Matplotlib و تابع تبدیل ()cvtColor در OpenCv

۶-تغییر فضاهای رنگ- opencv

۷-تقسیم و ادغام کانال های تصویری با opencv

۸-بخشبندی تصویر (Image Segmentation)

۹-آستانه گذاری ساده

۱۰- هیستوگرام در پردازش تصویر


image -processing-python-opencv

خواندن و نمایش و نوشتن تصویر در پایتون

۱- پردازش تصویر چیست؟
۲- فرمت تصویر
۳ – نمایش فرمت تصویر
۴ – کانال
۵- خواندن یا وارد کردن تصویر
۶ – نمایش تصویر در OpenCv
۷ – نوشتن یا ذخیره تصویر در OpenCV
۷-۱ – فشرده سازی تصویر
۷-۲ – تصاویر رستری
۷-۳ – تصاویر برداری


پردازش تصویر چیست؟

باعث خوشحالیه که با سوفرا، همراه هستید. پردازش تصویر، فرایند دستکاری یا انجام عملیات بر روی تصاویر، برای دستیابی به یک اثر معین (ایجاد یک تصویر سیاه و سفید به عنوان مثال) یا گرفتن اطلاعاتی از یک تصویر(مانند شمردن تعداد دایره ها یا مربع ها ) توسط  یک کامپیوتر  است.

شروع کار پردازش تصویر  با  ایمپورت ها است. ما از کتابخانه های  cv2، numpy و کمی از matplotlib (اغلب به عنوان یک روش راحت برای نمایش تصاویر) استفاده می کنیم .

matplotlib : کتابخانه ای برای رسم نمودارها

matplotlib.pyplot: هر تابع pyplot باعث تغییراتی در شکل می شود: به عنوان مثال شکلی را  می گیرد،  یک منطقه ترسیم در شکل ایجاد می کند،   چند خط در یک منطقه  از شکل ترسیم میکند،  شکل را با برچسب و غیره تزئین می کند و … .

NumPy : کتابخانه ای  برای محاسبات علمی با پایتون است. این شامل موارد زیر است:
۱) یک آبجکت آرایه n بعدی قدرتمند

۲) ابزاری برای ادغام C / C ++ و کد Fortran 

۳) …..

import cv2,matplotlib
import numpy as np
import matplotlib.pyplot as plt

فرمت تصویر

بسيار خوب! ما نیاز داریم تصاویر را بخوانیم تا فرمتی که آنها نشان میدهند را بفهمیم.در OpenCv تصاویر به صورت زیر آرایه ۳ بعدی numpy نمایش داده می شوند. یک تصویر رنگی  از ردیف های پیکسل تشکیل شده و هر پیکسل با آرایه ای از مقادیر رنگ نمایش داده می شود.

BGR

BGR

نمایش فرمت تصویر

(اساسا یک آرایه ۳ بعدی از اطلاعات رنگ پیکسل، در قالب BGR):

print( img)
[[[۱۸۳ ۱۸۳ ۱۸۳][۱۰۲ ۱۰۲ ۱۰۲][۱۰۲ ۱۰۲ ۱۰۲]..., [۱۰۲ ۱۰۲ ۱۰۲][۱۰۲ ۱۰۲ ۱۰۲][۱۰۲ ۱۰۲ ۱۰۲]]

[[۱۰۲ ۱۰۲ ۱۰۲][۱۹۳ ۱۹۳ ۱۹۳][۲۵۳ ۲۵۳ ۲۵۳]..., [۱۶۸ ۱۶۸ ۱۶۸][۲۵۴ ۲۵۴ ۲۵۴][۱۹۳ ۱۹۳ ۱۹۳]]
[[۲۵۳ ۲۵۳ ۲۵۳][۲۵۲ ۲۵۲ ۲۵۲][۲۵۲ ۲۵۲ ۲۵۲]..., [۱۶۷ ۱۶۷ ۱۶۷][۲۵۳ ۲۵۳ ۲۵۳][۲۵۲ ۲۵۲ ۲۵۱]]
..., [[۲۵۵ ۲۵۵ ۲۴۷][۲۵۵ ۲۵۵ ۲۴۷][۲۵۴ ۲۵۴ ۲۵۱]..., [ ۶۸ ۶۲ ۵۶][۲۰۲ ۱۹۷ ۱۹۱][۱۳۶ ۱۲۳ ۱۰۹]]
[[۲۵۵ ۲۵۵ ۲۴۷][۲۵۵ ۲۵۵ ۲۴۶][۲۵۵ ۲۵۵ ۲۵۰]..., [۱۲۱ ۱۱۶ ۱۱۱][۱۸۶ ۱۷۹ ۱۷۳][۱۲۱ ۱۱۰ ۹۷]]
[[۲۵۵ ۲۵۵ ۲۴۴][۲۵۵ ۲۵۵ ۲۴۳][۲۵۵ ۲۵۵ ۲۴۶]..., [۱۷۸ ۱۷۲ ۱۶۶][۱۴۵ ۱۳۶ ۱۲۷][۱۰۷ ۹۶ ۸۴]]]

اینجا [ ۱۴۵ ۱۳۶ ۱۲۷] و… ، مقادیر یک پیکسل، آبی، قرمز و سبز (BGR) هستند. توجه داشته باشید که OpenCV به طور پیش فرض یک تصویر را در قالب BGR بارگذاری می کند.

کانال 

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


خواندن یا وارد کردن تصویر(imread )

BGR-RGB

تصویر اصلی

import numpy as np
import cv2
img = cv2.imread('test.jpg')
print(img)

برای خواندن تصویر در opencv، از تابع imread استفاده می کنیم. آرگومان این تابع آدرس محل ذخیره تصویر است. 

cv2.imread(filename[, flags]) → retval
cv2.imread('test.jpg',0 or 1 or -1)

آرگومان اول نام و محل تصویر  که داخل کوتیشن است.  تصویر باید در داخل پوشه ای باشد که فایل پایتون  در آن قرار  دارد  وگرنه باید مسیر کامل تصویر  نوشته شود.

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

۱) cv2.IMREAD_COLOR: تصویر رنگی را بارگیری می کند و هر گونه شفافیت تصویر را نادیده می گیرد. این پرچم پیش فرض است:

پرچم بزرگتر از ۰ تصویر رنگی سه کاناله(قرمز، سبز،آبی)  و عمق ۸ بیتی برمیگرداند. BGR

cv2.imread('test.jpg')
or
cv2.imread('test.jpg',1)
or
cv2.imread('test.jpg',cv2.IMREAD_COLOR)

۲) cv2.IMREAD_GRAYSCALE: بارگیری تصویر در حالت خاکستری یک کانال و عمق ۸ بیتی:

cv2.imread('test.jpg',0)

۳) cv2.IMREAD_UNCHANGED: تصویر را به عنوان  کانال آلفا بارگیری می کند:

اگر پرچم کوچکتر از ۰ باشد تصویر ۴ کاناله برمیگرداند. تابع وقتی تصویر ۱۶/۳۲ بیتی برمیگرداند که تصویر ورودی دارای یک همچین عمقی باشد وگرنه آ ن را به ۸ بیتی تبدیل میکند

cv2.imread('test.jpg',-1)
or
cv2.imread('test.jpg',cv2.IMREAD_UNCHANGED)

نکته

به جای این سه پرچم، به سادگی می توانید عدد صحیح ۱، ۰ یا -۱ را منتقل کنید.

کد زیر را ببینید:

 import numpy as np
import cv2
img = cv2.imread('test.jpg',0)

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

هشدار

حتی اگر مسیر تصویر اشتباه باشد، خطایی نخواهد داشت، اما img  چاپ نمیشود.

img = cv2.imread('test.jpg')

 نمایش تصویر(imshow) در  OpenCv

 cv2.imshow()

از تابع ()cv2.imshow،  برای نمایش تصویر در یک پنجره استفاده می کنیم. پنجره به طور خودکار با اندازه تصویر متناسب می شود. این تابع دو آرگومان دارد. اولین آرگومان نام پنجره است که یک رشته میباشد. آرگومان دوم تصویری است که با خواندن  آن، در یک متغیر ذخیره کردیم. شما میتوانید تعداد بیشتری پنجره با یک تصویر ایجاد کنید ولی باید نام تصاویر متفاوت باشد. 

import cv2
img = cv2.imread('test.png')
cv2.imshow('opencv',img)
c = cv2.waitKey(0)
cv2.destroyAllWindows()
11

cv2.imshow()

 

 

 

Waits for a pressed key(منتظر برای فشار دادن یک کلید ازصفحه کلید).  یک تابع اتصال به  صفحه کلید است. یک آرگومان دارد که زمان در میلی ثانیه است.

cv2.waitKey([delay]) → retval

پارامتر ها

delay 

تاخیرزمان به میلی ثانیه . ۰ به عنوان آرگوان ورودی مقدار ویژه ای است به معنای “بی وقفه” است.

اگر  (\texttt{delay}\leq 0 ) باشد یعنی پنجره برای مدت نامحدودی منتظر می ماند تا زمانی یک کلید از صفحه کلید را فشار دهیم و آن بسته شود. 

اگر مقدار delay  مثبت باشد مثلا ۱۰۰۰، بعد از یک ثانیه پنجره به صورت خودکار بسته میشود. 

این تابع یا کد کلید فشار داده شده از صفحه کلید را بر میگرداند یا -۱(یعنی کلیدی  قبل از زمان مشخص فشار داده نشده . برای من ۲۵۵ بر میگرداند.) 

نکته

این تابع زمانی کار میکند که  حداقل یک پنجره

در حالی که OpenCV برای استفاده در برنامه های کاربردی تمام عیار طراحی شده است و می تواند در چارچوب های عملکردی غنی از UI (مانند Qt *، WinForms * یا Cocoa *) یا بدون استفاده از رابط کاربری مورد استفاده قرار گیرد، گاهی اوقات لازم است که سرعت عمل را امتحان و نتایج را تصور کنید. این همان چیزی است که ماژول HighGUI برای آن طراحی شده است.

destroyAllWindows

تابع destroyAllWindows تمام پنجره های باز شده HighGUI را از بین می برد.

قطعه کد زیر نشان میدهد که اگر کلیدی فشار داده نشود تصویر بی وقفه نمایش داده میشود، تا زمانی که یک کلید فشار دهیم یا خودمان پنجره را ببندیم.

import cv2
def sufra():
img = cv2.imread('test.png')
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
print ("waitkey")

if __name__ == '__main__':
sufra()

waitkey

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

۱۰۶ کد اسکی حرف h  میباشد.

import cv2
def sufra():
img = cv2.imread('test.png')
cv2.imshow('image', img)
key=cv2.waitKey(1000)
cv2.destroyAllWindows()
print (key)
print ("waitkey")

if __name__ == '__main__':
sufra()

۲۵۵
waitkey
۱۰۴
waitKey

در کد  از دستور if استفاده کردیم که فقط با  فشار دادن کلید q،پنجره بسته میشود. 

ord()

تابع ()ord یک رشته یا کاراکتر میگرد و کد اسکی آن را بر میگرداند.

import cv2
def sufra():
img = cv2.imread('test.png')
while True:
cv2.imshow('image', img)
if cv2.waitKey(1)  == ord('q'):
cv2.destroyAllWindows()
print ("q")
break;

if __name__ == '__main__':
sufra()

waitKey

() cv2.destroyAllWindows

به راحتی تمامی پنجره هایی که ایجاد کردیم  را از بین می برد. اگر می خواهید پنجره خاصی را از بین ببرید، از تابع ()cv2.destroyWindow  استفاده کنید.

cv2.destroyAllWindows() → None

نکته

یک مورد خاص وجود دارد که شما قبلا می توانید یک پنجره ایجاد کنید و تصویر را بعدا بارگذاری کنید. در این صورت، می توانید مشخص کنید که آیا پنجره قابل اندازه بندی مجدد است یا نه.
  این کار توسط تابع () cv2.namedWindow انجام می شود. به طور پیش فرض، پرچم cv2.WINDOW_AUTOSIZE است.اما اگر شما پرچم را به عنوان cv2.WINDOW_NORMAL مشخص کنید،می توانید پنجره را تغییر دهید. هنگامی که تصویر در ابعاد بزرگ، مفید خواهد بود: 

cv2.namedWindow(winname[, flags]) → None

پارامترها

name : نامی برای پنجره که ممکنه به عنوان شناسه هم استفاه شود

flags(پرچم های پنجره):

WINDOW_NORMAL  :   اگر تنظیم شده باشد، کاربر می تواند پنجره را تغییر دهد (بدون محدودیت).
WINDOW_AUTOSIZE  : اگر تنظیم شده باشد، اندازه پنجره به صورت خودکار براساس تصویر نمایش داده می شود ، و شما نمی توانید اندازه پنجره را به صورت دستی تغییر دهید.
WINDOW_OPENGL اگر  : تنظیم شده باشد، پنجره با پشتیبانی OpenGL ایجاد خواهد شد.

import cv2
img = cv2.imread('test.png')
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image',img)
cv2.waitKey(0)
k=cv2.destroyAllWindows()
print(k)
None

نوشتن یا ذخیره تصویر(imwrite  ) در OpenCV 

 

cv2.imwrite()


از تابع ()cv2.imwrite  برای ذخیره یک تصویر در یک فایل مشخص شده استفاده میشود.

cv2.imwrite(filename, img[, params]) → retval

پارامتر ها

 

filename : نام  برای فایل انتخاب یکنیم 

image: تصویر  برای ذخیره شدن

تابع imwrite تصویر را در فایل مشخص شده ذخیره می کند. فرمت تصویر بر اساس فرمت نام فایل انتخاب شده است. 

 

فشرده سازی تصویر

قبل از ذخیره کردن تصویر، فشرده سازی  جهت  حذف اطلاعات تکراری، انجام میشود. نوع فایل تصویر یا رستر یا بردار است:

تصاویر رستری 

ساخته شده از پیکسل
تغییر اندازه باعث تغییر در کیفیت تصویر میشد.

فرمت های رایج: jpg، png، gif، tif، bmp

تصاویر برداری

ساخته شده از اشیاء بردار (نه مبتنی بر پیکسل)
می تواند به هر اندازه ای تغییر کند بدون عوض کاه یا افزایش کیفیت
• فرمت های رایج: ai، eps، ps، svg، wmf، pdf

 

vector-raster

Bitmap-vector-raster

https://commons.wikimedia.org/wiki/File:Bitmap_VS_SVG.svg

 

 در پردازش تصویر، تصاویر رستری به کار میرود.

 با استفاده از تابع imwrite،  می توان فقط تصاویر  8 بیتی (یا ۱۶ بیت بدون امضای (CV_16U) در حالت تک کانال یا ۳ کانال ( BGR) را ذخیره کرد). ( مانند PNG، JPEG 2000 و TIFF) 

امکان استفاده از این تابع برای ذخیره تصاویر PNG با کانال آلفا وجود دارد.

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

import numpy as np
import cv2
img = cv2.imread('test.png')
cv2.imshow('image',img)
k = cv2.waitKey(0)
# را فشار بدیم Escاگر
#پنجره بسته میشود
if k == 27: </span>
cv2.destroyAllWindows()
#اگر این حرف را فشار بدهیم تصویر با نام انتخابی ذخیره میشود.
elif k == ord('s'): </span>
cv2.imwrite('save.jpg',img)</span>
cv2.destroyAllWindows()</span>


۱-پردازش تصویر با پایتون-OpenCV
۲-آموزش نصب pip در پایتون
۳-
کتابخانه های مورد نیاز پردازش تصویر
۴ – خواندن و نمایش فرمت تصویر در پایتون
۵- نمایش تصویرRGB با Matplotlib و تابع تبدیل ()cvtColor در OpenCv

۶-تغییر فضاهای رنگ- opencv
۷-تقسیم و ادغام کانال های تصویری با opencv


آموزش قبلی

آموزش بعدی

image -processing-python-opencv

نمایش تصویرRGB با Matplotlib و تابع تبدیل ()cvtColor در OpenCv

.

۱- نمایش تصویرRGB با Matplotlib</a
۱- ۲خواندن و نمایش تصویر فقط با opencv
۱- ۳خواندن و نمایش تصویر فقط با matplotlib
۱- ۴ خواندن تصویر با opencv و نمایش آن توسط matplotlib
۲- تابع تبدیل ()cvtColor در OpenCv

 

 


نمایش تصویرRGB با Matplotlib

 


می دانیم که کتابخانه  matplotlib ، برای کار با نمودارها و ارقام است. اما اگر خواستیم یک تصویر ساده RGB را نمایش دهیم چه؟ آیا می توانیم با matplotlib انجام دهیم؟

در این قسمت مابه شما نشان می دهیم که چگونه یک تصویر RGB  را با matplotlib فقط در چند خط کد  میشه نشان داد و هرگونه ابهاماتی را که هنگام استفاده از OpenCV و matplotlib وقتی با هم اجرا میشوند، مواجه می شوید روشن کنید.

یک تصویر RGB، که گاهی اوقات به عنوان یک تصویر رنگی واقعی نامیده می شود، به صورت یک آرایه سه بعدی  داده m × n × ۳ ذخیره می شود که کانالهای قرمز، سبز و آبی رنگ را برای هر پیکسل تعریف می کند. رنگ هر پیکسل با ترکیبی از فرمت های فایل های گرافیکی تصاویر RGB، به عنوان تصاویر ۲۴(۸*۳) بیتی ذخیره می شود، حال آنکه هر کدام از کانالهای قرمز، سبز و آبی ۸ بیت هستند.

 

تصویر اصلی

 

خواندن و نمایش تصویر فقط با opencv

کد زیر فقط از opencv برای خواندن و نمایش تصویر استفاده  کرده است. توجه داشته باشید که فرمت رنگ پیش فرض در OpenCV  BGR است (بایت ها معکوس می شوند).

import numpy as np
import cv2
img = cv2.imread('test.png')
cv2.imshow('opencv',img)
cv2.waitKey (0)
cv2.destroyAllWindows ()

خروجی:

11

 

خواندن و نمایش تصویر فقط با 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 است  برای نمایش استفاده کردیم.
ما می توانیم تصویر زیر را ببینیم:

 

12

در مورد خلاص شدن از محور  و اعداد از کد زیر استفاده میکنیم:

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

 

اما نتیجه انتظار نمی رفت تصویر زیر باشد:

13

 

چرا نتیجه مورد انتظار نیست؟

پاسخ به عنوان یک نکته در opencv نهفته است.

 

نکته

OpenCV تصاویر RGB را به عنوان آرایه های چند بعدی Numpy معرفی می کند … اما به ترتیب معکوس! به این معنی که تصاویر در واقع در BGR به جای RGB نشان داده شده است!

پس چگونه این مسئله را حل کنیم؟

 

 تصویر را از BGR به RGB   تبدیل   کنیم:


تابع تبدیل ()cvtColor در OpenCv 


این تابع یک تصویر ورودی را از یک فضای رنگی به یکی دیگر تبدیل می کند.  در صورت تغییر به-از فضای رنگ 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()

 

نتیجه اسکریپت ما نشان می دهد که رنگ های تصویر ما درست است.