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

آستانه گذاری ساده-تطبیقی -Otsu

۱- آستانه  گذاری ساده
۱-۲- cv2.threshold
۱-۳- آستانه گذاری باینری
۱-۴- آستانه گذاری باینری معکوس
۱-۵- Truncate Thresholding ( type = THRESH_TRUN
۱-۶- Inverted Threshold to Zero
۲- Adaptive Thresholding
۳- Otsu’s Binarization


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

مرسوم ترین خصوصیت تصویر برای  آستانه گذاری، سطح  خاکستری پیکسل است:
اگر T آستانه باشد

g(x,y) = ۰ if f(x,y) < T  و g(x,y) = ۱ if f(x,y) ≥ T

اگر دو تا آستانه داشته باشیم  T1 < T1  :

g(x,y) = ۰ if f(x,y) < T1 OR f(x,y) > T2 and g(x,y) = ۱ if T1 ≤ f(x,y) ≤ T2

Simple Thresholding

https://www.cs.auckland.ac.nz

 

cv2.threshold

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

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

cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst

پارامترها

src : آرایه ورودی همان تصویر ورودی( تک کاناله(خاکستری )، ۸ بیتی یا ۳۲ بیتی شناور)

dst : آرایه یا تصویر خروجی که هم اندازه و هم نوع با تصویر ورودی است.

thresh : مقدار آستانه

maxval : حداکثر مقدار برای استفاده دو نو آستانه گذاری ساده THRESH_BINARY و THRESH_BINARY_INV .

type  : نوع آستانه گذاری

 

OpenCV سبک های مختلف آستانه گذاری ساده  را فراهم می کند و توسط پارامتر چهارم تابع تعیین می شود:

  • cv2.THRESH_BINARY
  • cv2.THRESH_BINARY_INV
  • cv2.THRESH_TRUNC
  • cv2.THRESH_TOZERO
  • cv2.THRESH_TOZERO_INV
Simple Thresholding

https://docs.opencv.org

 

 

آستانه گذاری باینری

ساده ترین شکل آستانه گذاری ، آستانه گذاری باینری نامیده می شود.

اگر (src (x، y بزرگتر از thresh باشد، مقدار (dst (x، y(تصویر مقصد) به maxValue تنظیم میشود، در غیر اینصورت آن را صفر تنظیم می کند.

ifsrc(x,y) &amp;amp;gt; thresh
dst(x,y) =maxValue
else
dst(x,y)  =0

Simple Thresholding

Simple Thresholding

 

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

 دو خروجی به دست می آید.یکی از آنها retval  است که بعدا توضیح داده خواهد شد.خروجی دوم تصویر آستانه ای است. بنابراین حتما باید از دو متغیر استفاده کنیم. 

Simple Thresholding

https://www.learnopencv.com

کد:

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

img = cv2.imread('threshold.png')
#&amp;amp;lt;strong&amp;amp;gt;thresh&amp;amp;nbsp;&amp;amp;lt;/strong&amp;amp;gt;= 0 و&amp;amp;nbsp;&amp;amp;lt;strong&amp;amp;gt;maxValue&amp;amp;lt;/strong&amp;amp;gt;&amp;amp;nbsp;= 255.
ret,thresh1 = cv2.threshold(img,0,255,cv2.THRESH_BINARY)
#با تغییر آستانه به ۳۵، شدت نور بالاتر از  ۳۵ نمایش داده میشود. 
ret,thresh2 = cv2.threshold(img,35,255,cv2.THRESH_BINARY)
ret,thresh3 = cv2.threshold(img,65,255,cv2.THRESH_BINARY)
#با آستانه ۱۲۷ و بیشترین مقدار ۱۲۵ ، شدت نور بالاتر از ۱۲۷ و با رنگ ۱۲۸ نمایش داده میشود. 
ret,thresh4 = cv2.threshold(img,127,128,cv2.THRESH_BINARY)
ret,thresh5 = cv2.threshold(img,0,128,cv2.THRESH_BINARY)

titles = ['Original Image','THRESH1','THRESH12','THRESH3','THRESH4','THRESH6']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]

for i in range(6):
 plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
 plt.title(titles[i])
 plt.xticks([]),plt.yticks([])

plt.show()
THRESH_BINARY

THRESH_BINARY

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('threshold.png')
ret,thresh1 = cv2.threshold(img,0,255,cv2.THRESH_BINARY)
# تغییر بیشترین مقدار به ۱۲۸، مقدار بخش آستانه گذاری شده را به ۱۲۸ تنظیم می کند.
ret,thresh2 = cv2.threshold(img,0,128,cv2.THRESH_BINARY)
ret,thresh3 = cv2.threshold(img,0,201,cv2.THRESH_BINARY)
ret,thresh4 = cv2.threshold(img,0,66,cv2.THRESH_BINARY)
ret,thresh5 = cv2.threshold(img,0,33,cv2.THRESH_BINARY)
titles = ['Original Image','THRESH255','THRESH128','THRESH201','THRESH6','THRESH33']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]
for i in range(6):
plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()

آستانه گذاری باینری معکوس

Inverse Binary Thresholding ( type = THRESH_BINARY_INV )
معکوس کردن آستانه گذاری دوتایی (فقط دو مقار سفید و سیاه را داریم) است.

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

if  src(x,y) &amp;gt; thresh
dst(x,y) = 0
else
dst(x,y) =maxValue

کد:

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

img = cv2.imread('threshold.png')
ret,thresh1 = cv2.threshold(img,0,255,cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(img,0,128,cv2.THRESH_BINARY_INV)

titles = ['Original Image','THRESH_BINARY','THRESH_BINARY_INV']
images = [img, thresh1, thresh2]
for i in range(3):
    plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])

plt.show()
THRESH_BINARY_INV

“THRESH_BINARY_INV

( Truncate Thresholding ( type = THRESH_TRUN

در این نوع آستانه، پیکسل مقصد به آستانه (thresh) تنظیم می شود اگر مقدار پیکسل منبع بیشتر از آستانه باشد. در غير اين صورت آن را به مقدار پيکسل منبع تنظيم مي کنيم. maxValue نادیده گرفته شده است.

الگوریتم:

if src(x,y) &amp;amp;gt; thresh
dst(x,y) =thresh
else
dst(x,y) =src(x,y)

توجه داشته باشید که تمام مقادیر بالای آستانه (۱۲۷) به ۱۲۷ تنظیم شده و تمام مقادیر کمتر یا برابر ۱۲۷ بدون تغییر هستند.

maxValue نادیده گرفته شده است

کد:

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('threshold.png',0)
ret,thresh1 = cv2.threshold(img,0,255,cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(img,0,127,cv2.THRESH_BINARY_INV)
ret,thresh3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
titles = ['Original Image','THRESH_BINARY','THRESH_BINARY_INV','THRESH_TRUNC']
images = [img, thresh1, thresh2,thresh3]
for i in range(4):
plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
Truncate Thresholding

Truncate Thresholding

Truncate Thresholding

Truncate Thresholding

Threshold to Zero ( type = THRESH_TOZERO )

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

الگوریتم:

if src(x,y) &amp;gt; thresh
  dst(x,y) =src(x,y)
else dst(x,y) =&amp;gt;0

کد:

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

img = cv2.imread('threshold.png',0)
ret,thresh1 = cv2.threshold(img,0,255,cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(img,0,127,cv2.THRESH_BINARY_INV)
ret,thresh3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
ret,thresh4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)

titles = ['Original Image','THRESH_BINARY','THRESH_BINARY_INV','THRESH_TRUNC','THRESH_TOZERO']
images = [img, thresh1, thresh2,thresh3,thresh4]
for i in range(5):
plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])

plt.show()

THRESH_TOZERO

THRESH_TOZERO

Inverted Threshold to Zero ( type = THRESH_TOZERO_INV)

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

الگوریتم:

if src(x,y) &amp;gt; thresh
dst(x,y) =0
else
dst(x,y) =src(x,y)

کد:

import cv2
 import numpy as np
 from matplotlib import pyplot as plt
img = cv2.imread('threshold.png',0)
 ret,thresh1 = cv2.threshold(img,0,255,cv2.THRESH_BINARY)
 ret,thresh2 = cv2.threshold(img,0,127,cv2.THRESH_BINARY_INV)
 ret,thresh3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
 ret,thresh4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
 ret,thresh5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)titles
 = ['Original Image','THRESH_BINARY','THRESH_BINARY_INV','THRESH_TRUNC','THRESH_TOZERO','THRESH_TOZERO_INV']
 images = [img, thresh1, thresh2,thresh3,thresh4,thresh5]
 for i in range(6):
plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
 plt.xticks([]),plt.yticks([])plt.show()
THRESH_TOZERO_INV

THRESH_TOZERO_INV

 

Adaptive Thresholding

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

**** برای محاسبه استانه محلی مراحل زیر طی می شود:****

۱) یک بلوک یا ناحیه bxb، اطراف مکان پیکسل توسط کاربر انتخاب می شود.b=3,5,7,…

۲) میانگین وزنی ناحیه bxb را محاسبه می کنیم. Opencv دو روش پیشنهاد می دهد:

— محاسبه میانگین ناحیه پیکسل  ناحیه bxb

— محاسبه میانگین وزنی گوسی مکان پیکسل ناحیه bxb

۳) برای محاسبه مقدار آستانه، میانگین  از یک مقدر ثابت(C) کم می شود:

 T= M- C

توابع ساده و سریع عبارتند از:

میانگین (mean) توزیع شدت محلی:

Eqn:eqnadp1

مقدار میانه(median )

Eqn:eqnadp2

یا میانگین حداقل و حداکثر مقادیر

Eqn:eqnadp3

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

 

Adaptive Thresholding

Adaptive Thresholding

از آنجا که این تصویر حاوی گرادیان روشنایی قوی است، آستانه سراسری، نتایج بسیار بدی را به وجود می آورد، همانطور که دیده می شود:

import cv2
import numpy as np
img = cv2.imread('sample.jpg')
ret,threshold1 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
cv2.imshow('threshold ',threshold1)
cv2.waitKey (0)
cv2.destroyAllWindows ()

 

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

cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst

این تابع تنها یک خروجی دارد و ورودی های آن به صورت زیر است:

src: تصویر ورودی

maxval: حداکثر مقدار ، که می تواند به خروجی اختصاص داده شود.

Adaptive Method :  نوع آستانه

cv2.ADAPTIVE_THRESH_MEAN_C: مقدار آستانه،  برای وزن متوسط تنظیم شده است.

cv2.ADAPTIVE_THRESH_GAUSSIAN_C: مقدار آستانه ، مجموعه ای از مقادیر ناحیه ای است که وزن آنها یک پنجره گاوسی است.

blockSize  : اندازه ناحیه ی همسایگی را تعیین میکند.

C: c، یک ثابت است که از میانگین یا میانگین وزنی کم میشود. 

dst :تصویر خروجی(باینری)

import cv2
 import numpy as np
 from matplotlib import pyplot as plt
img = cv2.imread('sample.jpg',0)
img = cv2.medianBlur(img,5)
ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
 th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,2)
 th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
 titles = ['Original Image', 'Global Thresholding (v = 127)','Adaptive Mean Thresholding',
 'Adaptive Gaussian Thresholding']
 images = [img, th1, th2, th3]
 for i in xrange(4):
 plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
 plt.title(titles[i])
 plt.xticks([]),plt.yticks([])
 plt.show()
Adaptive Thresholding

Adaptive Thresholding

Adaptive Thresholding

Adaptive Thresholding

تفاوت آستانه ساده با تطبیقی در این تصویر مشهود است.

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

از سوی دیگر، آستانه گذاری تطبیقی محلی، یک آستانه منحصربه فردی را برای هر پیکسل بر اساس محدوده ای از میزان شدت در همسایگی محلی انتخاب می کند. این آستانه گذاری، برای  تصاویری که هیستوگرام شدت روشنایی، دارای قله های متمایز نباشد(مانند:بخش بندی متن از تصویر)، مناسب است.

این روش در ناحیه اطراف متن نتیجه بخش است. زیرا پیکسل های پیش زمینه و پس زمینه در محدوده همسایگی هر پیکسل به اندازه کافی وجود دارد.
با این حال در margin(ناحیه اطراف متن)،  میانگین ناحیه محلی به عنوان یک آستانه مناسب نیست، زیرا محدوده مقادیر شدت در همسایگی محلی، بسیار کوچک است و میانگین نزدیک به پیکسل مرکزی است. این وضعیت را می توان بهبود داد، اگر آستانه مورد استفاده  mean نباشد مگر  (mean-C)،  که C یک ثابت است.
بنابراین  تمام پیکسل هایی که در محدوده ی یکسان وجود دارند (به عنوان مثال در امتداد حاشیه) به پس زمینه تنظیم می شود.
نتیجه ۷ × ۷ همسایگی و C = 7 نشان داده شده است :

Adaptive Thresholding

Adaptive Thresholding

Adaptive Thresholding

Adaptive Thresholding


تاثیر انتخاب  cوb های متفاوت در تصویر خروجی.
میتوان به اهمیت این دو ورودی پی برد.

Otsu’s Binarization (تقسیم بندی Otsu)

در این روش قرار است از خروجی دوم روش آستانه گیری ساده، retVal استفاده کنیم. چرا ما از این روش استفاده می کنیم؟?؟
در آستانه گیری ساده ما از یک مقدار سراری استفاده کردیم. ولی از کجا بدونیم این مقدار، یک مقدار خوب و بهینه است؟  بله. با آزمون و خطا.

روش آستانه گذاری Otsu ، تصویر را به گونه ای تقسیم بندی می کند که تصویر با بهترین مقدار آستانه به دو کلاس سیاه و سفید یا پیش زمینه و پس زمینه یا پس زمینه و شی تقسیم می شود:

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

برای همین ما از تابع cv2.threshold() استفاده می کنیم ولی یک فلگ اضافی ، cv2.THRESH_OTSU را داریم . این روش مقدار بهینه آستانه را در retVal قرار می دهد و مقدار threshold برابر ۰ می شود.

Otsu’s Binarization

تصویر اصلی نویز دار

Otsu’s Binarization

Otsu’s Binarization

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

img = cv2.imread('bimodal_hsv_noise.png',0)

# global thresholding
ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)

# Otsu's thresholding
ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

# Otsu's thresholding after Gaussian filtering
blur = cv2.GaussianBlur(img,(5,5),0)
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

# plot all the images and their histograms
images = [img, 0, th1,
          img, 0, th2,
          blur, 0, th3]
titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)',
          'Original Noisy Image','Histogram',"Otsu's Thresholding",
          'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]

for i in xrange(3):
    plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
    plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])
    plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
    plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])
    plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')
    plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])
plt.show()

تک آستانه، دو سطحی

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

Otsu’s Binarization

آستانه گذاری دوسطحی ، تک آستانه

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

آستانه گذاری چند سطحی با چند آستانه

 

تصویری که بیش از یک آستانه دارد، آستانه گذاری چند سطحی می باشد. 

Otsu’s Binarization

تصویر اصلی

Otsu’s Binarization

آستانه گذاری چند سطحی با دو آستانه

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('sample.jpg',0)
ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
blur = cv2.GaussianBlur(img,(5,5),0)
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
images = [img, 0, th1,
img, 0, th2,
blur, 0, th3]
titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)',
'Original Noisy Image','Histogram',"Otsu's Thresholding",
'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]
for i in xrange(3):
plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])
plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])
plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')
plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])
plt.show()

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



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

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

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

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

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

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


 

Image Segmentation

آستانه گذاری درOpenCV

۱- Image Segmentation
۱- آستانه گداری(Threshold) تصویر چیست؟


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

هدف پردازش تصویر دیجیتال، استخراج اطلاعات مفید(آبجکت، شی، ۲۵۵، ۱، روشن) از تصاویر، بدون کمک انسان است.

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

 

 

خروجی بخشبندی

 

۱) پیکسلهای لبه یا مرز یک بخش. کاربرد:  گوشه ها یا حالت  ناحیه ی مد نظر  را مشخص میکند.

۲) تمام پیکسلهای درون یک بخش. کاربرد: ویژگیهای درونی بخش های تصویر مثل بافت، رنگ و … را مشخص میکند.

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

 

تکنیکهای بخشبندی

۱)  contextual (بخش بندی بر اساس لبه ها)

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

Contexuall

۲) non-contextual (بخش بندی بر اساس نواحی)

 بر اساس شباهت سطوح خاکستری ، تصویر،  در ابتدا با آستانه گذاری، ناحیه را گسترش داده و با ادغام کردن  بخش ها، بخشبندی میشود. همین جا اشاره کنم که آستانه گذاری از نوع non-contextual میباشد.(ماسکهای آشکار ساز لبه ها، همانند فیلتر بالاگذر حوزه فرکانس  که در قسمتهای بعدی توضیح داده میشوند، میباشند.)

non

کاربرد بخشبندی

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

آستانه گداری(Threshold) تصویر چیست؟

آستانه‌گذاری  مناسب‌ترین و ساده ترین تکنیک بخش بندی non-contextual است.
با اعمال آستانه‌گذاری بر روی تصویر در مقیاس خاکستری، تصویری باینری(۰و۱) بدست می‌آید که تصویر به دو بخش کاملا جدا از هم تقسیم میشود.یکی از آنها حاوی پیکسل هایی با مقادیر داده ورودی کوچکتر از آستانه و دیگری مربوط به مقادیر ورودی است که برابر آستانه یا بیشتراز آن هستند. مناطق اول و دوم معمولا به ترتیب با برچسب صفر (۰) و غیر صفر (۱) برچسب گذاری می شوند. آستانه گذاری ، ممکن است دارای چند آستانه باشد که تصویر را به چند بخش مجزا تقسیم میکنند.

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

به عبارت دیگر آستانه گذاری شامل تقسیم یک تصویر به دو منطقه است: یک منطقه آبجکت و یک منطقه پس زمینه.
threshold e

تصویر زیر را با دقت مشاهده کنید:

threshold

https://www.learnopencv.com

چند عدد می بینید؟
اکثر شما اعداد زیر را می بینید:
۳۲ (آه، بله، به دقت نگاه کنید)، ۶۴، ۱۰۰، ۱۲۸، ۱۸۰، ۲۰۰ و ۲۵۵٫ اما در تصویر، اعداد بیشتری وجود دارد که به چشم نمیاد.

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

در حقیقت تمام اعداد در تصویر اصلی یک مقدار خاکستری  برابر با عدد دارند. بنابراین ۲۵۵ روشنترین و ۵ تاریک ترین است.

 خواندن اعداد در تصویر آستانه گذاری شده  آسان تر از خواندن اعداد در تصویر اصلی است. جای تعجب نیست که یک الگوریتم  تصویر آستانه گذاری شده، بسیار ساده تر از تصویر اصلی،  پردازش می کند.
تمام الگوریتم های آستانه گذاری، یک تصویر منبع (src) و مقدار آستانه (thresh) به عنوان ورودی میگیرند، و با مقایسه مقادیر پیکسل در پیکسل  تصویر منبع (x، y) با آستانه،  یک تصویر خروجی (dst) تولید می کند. اگر src (x، y)> thresh باشد، سپس (dst (x، y یک مقدار را تعیین می کند. در غیر این صورت، (dst (x، y مقدار دیگری را ایجادمی کند.

سه روش آستانه ‘گذاری داریم که در قسمتهای بعدی توضیح داده خواهند شد:
+ Simple thresholding
+ Adaptive thresholding
+ Otsu’s thresholding

 



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

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

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

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

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

 


 

image -processing-python-opencv

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

۱- تغییر فضاهای رنگ- opencv
۲- HSV
۲-۱ Hue
۲-۳ Value
۲-۴ Saturation or intensity
۲-۵ HSV چه کاربردی دارد؟
۲-۵ استخراج سه شی رنگی از تصویر
۲-۵ برای پیدا کردن مقادیر HSV چکار باید کرد؟
۳- Grayscale


تغییر فضاهای رنگ

 

در این آموزش،  نحوه ی  تبدیل تصاویر از یک فضای رنگی به دیگری را  یاد خواهیم گرفت. مانند: BGR \leftrightarrowGray, BGR \leftrightarrow HSV. علاوه بر این، یک برنامه ایجاد می کنیم که ۳ شیء رنگی را از یک تصویر استخراج کند، و در ادامه به تصاویر خاکستری می پردازیم. در OpenCV، بیش از ۱۵۰ روش تبدیل فضای رنگ وجود دارد. اما تنها دو مورد که بیشتر مورد استفاده قرار می گیرند، به BGR ↔ Gray و BGR ↔ HSV را توضیح می دهیم .


برای تبدیل رنگ، از تابع (cv2.cvtColor (input_image، flag استفاده می کنیم که در آن پرچم، نوع تبدیل را تعیین می کند.

برای تبدیل  BGR →Gray،   از پرچم cv2.COLOR_BGR2GRAY و برای BGR → HSV، از پرچم cv2.COLOR_BGR2HSV استفاده می کنیم. .
برای دریافت پرچم های دیگر، فقط دستورات زیر را در ترمینال پایتون خود اجرا کنید:

import cv2
flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
print flags

 (HSV)

یک فضای رنگی مناسب، مدل رنگی HSV است. همانطور که گفتم قراره اشیاء داخل یک تصویر را  از آن جدا کنیم. تشخیص یا استخراج اشیاء در خیلی جاها از جمله کنترل وسایل نقلیه و  ترافیک کاربرد دارد. در واقع در این مدل، دو ویژگی روشنایی و شدت نور، کمک زیادی می کند. این مدل، دارای سه ویژگی متمایز است:

Hue


نام رنگ (زرد، سبز، صورتی و..) . 

Value

 

روشنایی یا تیرگی رنگ (خاکستری)



Saturation or intensity

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

 

نکته

در فضای رنگ HSV، محدوده رنگ [۰،۱۷۹]، محدوده اشباع [۰،۲۵۵] و محدوده مقدار [۰،۲۵۵] است. نرم افزار های مختلف از مقیاس های مختلف استفاده می کنند. بنابراین اگر مقادیر OpenCV را با آنها مقایسه کنید، باید این محدوده ها را نرمال کنید.

مدل رنگ HSV چه کاربردی دارد؟

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

در HSV، رنگ آمیزی ساده تر از BGR رنگی است. 

 

 

hsv

 

hsv
hsv
hsv

HSV

 

استخراج سه شی رنگی از تصویر

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

  1. برنامه،  تصویر را بگیرد
  2. تبدیل از فضای رنگ BGR به HSV انجام دهد.

 

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

در حال حاضر تنها ۳ شیء آبی و سبز و قرمز را استخراج می کنیم، می توانیم هر آنچه را که می خواهیم انجام دهیم.
کد:

 

import cv2
import numpy as np
img = cv2.imread('bgrtohsv.png')
#تبدیل فضای رنگ bgr to hsv
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV )

lower_blue = np.array([110,50,50])
upper_blue = np.array([120,255,255])

lower_green = np.array([50,50,50])
upper_green = np.array([60,255,255])

lower_red = np.array([0,50,50])
upper_red = np.array([0,255,255])
#آستانه گیری(cv2.inRange())
maskb = cv2.inRange(hsv, lower_blue, upper_blue)
maskg = cv2.inRange(hsv, lower_green, upper_green)
maskr = cv2.inRange(hsv, lower_red, upper_red)
# and تصویر اصلی با ماسک
#میشود (cv2.bitwise_and())
resb = cv2.bitwise_and(img,img, mask= maskb)
resg = cv2.bitwise_and(img,img, mask= maskg)
resr = cv2.bitwise_and(img,img, mask= maskr)

cv2.imshow('original image',img)
cv2.imshow('maskb',maskb)
cv2.imshow('maskg',maskg)
cv2.imshow('maskr',maskr)

cv2.imshow('resb',resb)
cv2.imshow('resg',resg)
cv2.imshow('resr',resr)

cv2.waitKey()
cv2.destroyAllWindows()

rgb-hsv

استخراج سه شی رنگی از تصویر

 

نکته

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

 

برای پیدا کردن مقادیر HSV چکار باید کرد؟

بسیار ساده است و شما می توانید از همان تابع ()cv2.cvtColor  استفاده کنید.

برای مثال، برای پیدا کردن مقدار HSV سبز، دستورات زیر را در ترمینال پایتون امتحان کنید:

green = np.uint8([[[0,255,0 ]]])
hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print hsv_green
[[[ ۶۰ ۲۵۵ ۲۵۵]]]

اکنون شما می توانید [H-10، ۱۰۰،۱۰۰] و [H + 10، ۲۵۵، ۲۵۵] را به ترتیب پایین تر و بالاتر محدوده رنگ  قرار دهید.

به غیر از این روش، می توانید از هر ابزار ویرایش عکس مانند GIMP یا هر مبدل آنلاین برای پیدا کردن این ارزش ها استفاده کنید.

اما فراموش نکنید که محدوده های HSV را تنظیم کنید.

 

تصاویر Grayscale(خاکستری)

دوربین های قدیمی فقط  قادر به نمایش تصاویر مونوکروم  یا تک رنگ  بودند. درکل سنسور دوربین تنها شدت نور را ثبت میکند که شدت نور طیفی خاکستری ایجاد میکند.

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

Grayscale

http://hamamatsu.magnet.fsu.edu

تصاویر خاکستری فقط دارای یک کانال رنگی(۸بیتی) در مقیاس ۰ تا ۲۵۵ هستند که نشان دهنده روشنایی آن پیکسل است، ۰ کاملا تاریک (سیاه) و ۲۵۵ کاملا روشن (سفید) است.

Grayscale

Grayscale

 

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

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

مثلا به رنگ سبز دقت کنید، فقط قسمتی که رنگ سبز داریم سفید وبقیه قسمت ها سیاه است. کانال سبز  یک کانال ۸ بیتی که به صورت   [0,255,0]:rgb مقدار دهی می شود و نشان دهنده ی این است که هر چه شدت نور به سمت ۲۵۵ باشد رنگ سبز بیشتر و هر چه به سمت ۰ باشد رنگ سبز کمتری داریم و در مورد کانال های دیگر هم همین استدلال را میشه کرد.

Grayscale

Grayscale

تبدیل تصویر به مقیاس خاکستری به ما یک  آرایه  دو بعدی و تنها یک کانال که ۸ بیت باشد  میدهد. یک جورایی پردازش راحتر و سریع تر و زوم روی یک کانال خاص است.

import numpy as np
import cv2
import matplotlib.pyplot as pltimg = cv2.imread('test.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
#تصویر خاکستری به عنوان آراه ای دوبعدیprint(gray_img)
[[۲۵۰ ۲۵۰ ۲۵۰ ..., ۲۵۰ ۲۵۰ ۲۵۰]
[۲۵۰ ۲۵۰ ۲۵۰ ..., ۲۵۰ ۲۵۰ ۲۵۰]
[۲۵۰ ۲۵۰ ۲۵۰ ..., ۲۵۰ ۲۵۰ ۲۵۰]
...,
[۲۵۰ ۲۵۰ ۲۵۰ ..., ۲۵۰ ۲۵۰ ۲۵۰]
[۲۵۰ ۲۵۰ ۲۵۰ ..., ۲۵۰ ۲۵۰ ۲۵۰]
[۲۵۰ ۲۵۰ ۲۵۰ ..., ۲۵۰ ۲۵۰ ۲۵۰]]
print (gray_img.shape)&amp;amp;lt;/span&amp;amp;gt;
(۶۴۰, ۶۴۰)
print (img.dtype)
uint8

و در نهایت تبدیل به تصویر خاکستری:

import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('test.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
plt.imshow(cv2.cvtColor(gray_img, cv2.COLOR_GRAY2RGB))
plt.show()
grayscale

تبدیل به تصویر خاکستری

 



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

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

 


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 بارگذاری می کند.

 

کانال 

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


خواندن یا وارد کردن تصویر

BGR-RGB

تصویر اصلی

 

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

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

cv2.imread(filename[, flags])&amp;nbsp;→ 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)

نکته

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

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

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

 

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

هشدار

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

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

 نمایش تصویر در  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 (&quot;waitkey&quot;)

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 (&quot;waitkey&quot;)

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 (&quot;q&quot;)
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

نوشتن یا ذخیره تصویر در 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:&amp;nbsp;&amp;lt;/span&amp;gt;
cv2.destroyAllWindows()
#اگر این حرف را فشار بدهیم تصویر با نام انتخابی ذخیره میشود.
elif k == ord('s'):&amp;nbsp;&amp;lt;/span&amp;gt;
cv2.imwrite('save.jpg',img)&amp;lt;/span&amp;gt;
cv2.destroyAllWindows()&amp;lt;/span&amp;gt;


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

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

 


آموزش قبلی

آموزش بعدی

داده کاوی با پایتون-روش الگوریتم   CRISP

 

 

 


روشهای داده کاوی

 

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

۱) طبقه بندی

۲) خوشه بندی

۳) کشف قانون همبستگی

۴) تشخیص و کشف خطا

۵) کشف الگوی ترتیبی

 

فرایند داده کاوی

کشف دانش از پایگاه داده ها:  Knowledge Discovery in Databases (KDD) 

 Knowledge Discovery in Databases (KDD) 

Knowledge Discovery in Databases (KDD)

همانطور که در تصویر بالا مشاهده میکنیم داده کاوی یکی از مراحل فرایند کشف دانش را تشکیل میدهد.

داده کاوی در کل مراحل و روش های مختلفی دارد.

برای داده کاوی اول باید

داده ها را  تمیز کرد،

دسته بندی کرد،

مشکلاتی که دارند رو حل کرد

و …

 

روش الگوریتم   CRISP

Cross Industry Standard Process:فرایندهای استاندارد صنعت متقابل برای داده‌کاوی(ویکی)

CRISP

Cross Industry Standard Process

مراحل الگوریتم   CRISP

 

مرحله اول فهم کسب و کار

مرحله دوم  درک داده ها

مرحله سوم  آماده سازی داده ها

مرحله چهارم درست کردن مدل اجرایی برای انجام داده کاوی

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

مرحله آخر از این مدل استفاده می کنیم برای تحلیل داده و توسعه

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

دایره بزرگ هم نشان دهنده ی تکمیل کل فرایند و آماده شدن آن برای استفاده در این پروژه یا پروژه های دیگر است.



 

داده کاوی با پایتون-Datamining

 


داده کاوی

 

داده کاوی، استخراج اطلاعات ناشناخته و مفید از عظیم داده ها است. داده کاوی و تکنیکهای آن در بسیاری از حوزه ها به کار گرفته شده است. میتوانیم با یک مثال ساده هم به این موضوع بپردازیم :

بیایید با هم تصور کنیم انبوه داده ی ما معدن سنگ است(Big_Data )

datamining-big-data

داده کاوی-داده های بزرگ

 

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

دانش

Knowledge-دانش

داده های بزرگ(Big_Data )

 

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

از ویژگیهای مهم Big_Data :

 

۱) ارزشمند بودن داده ها(value)

۲)متنوع بودن داده ها(variety

۳)حجیم بودن داده ها(volume)حجم زیاد یعنی اونقدر داده ها زیاد باشه که به راحتی نشه تجزیه و تحلیل کرد. فقط با ابزار خاص.

۴)داده ها به سرعت در حال تغییر و تولید هستند(Velocity)

۵)داده ها به درد بخور و صحیح هستند(veracity)

*****در کل سه ویژگی اول از همه مهمتر هستند. *****

 

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

  1. وارد کردن و تصویر سازی از داده ها
  2.  طبقه بندی و خوشه بندی داده ها
  3. کشف روابط  در داده ها با استفاده از رگرسیون و اقدامات همبستگی
  4. کاهش ابعاد داده ها به منظور فشرده سازی و تجسم اطلاعاتی که به ارمغان می آورد
  5. تجزیه و تحلیل داده های ساختاری

هر موضوع، بر اساس چهار کتابخانه بزرگ پایتون، برای تجزیه و تحلیل و دستکاری داده ها، بررسی  شده است: numpy، matplotlib، sklearn و networkx.

 

 

در قسمت بعدی درمورد فرایند و روشهای داده کاوی  توضیح خواهیم داد.


 


 

تفاوت تصاویر دیجیتال و آنالوگ

تصویر چیست؟

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

 

http://hamamatsu.magnet.fsu.edu پردازش تصویر

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

تصویر خاکستری(grayscale)

یک تصویر خاکستری (grayscale)، یک تابع یا سیگنال دو بعدی مانند:(p(x,y ، که مقدار آن برابر شدت روشنایی است. xوy مختصات مکانی هستند و z شدت روشنایی:

p(x,y)=z

 

 

16

 

15

 

به هر کدام از این خونه ها یک پیکسل وارزش آن حدود ۱ بایت یعنی مقداری بین ۰-۲۵۵ (۰=سیاه و ۲۵۵=سفید).

 

 

 

 

از کجا تصاویر گرفته می شوند؟
 دوربین های دیجیتال
 اسکنرهای MRI
بسته های گرافیکی کامپیوتری
 اسکنرهای بدن

تصویر دیجیتال

A Charge Coupled Device (CCD)

14

 

دوربین دیجیتال یک دستگاه الکترونیکی است که برای گرفتن عکس و ذخیرهٔ آن بجای فیلم عکاسی از حسگرهای حساس به نور معمولاً از نوع CCD یا CMOS استفاده می‌کند و تصویر گرفته شده توسط سنسور طی چند مرحله به حافظهٔ دوربین برای استفاده فرستاده می‌شود.ویکی

پیکسل(pixel)

در این دوربین‌ها تصویر توسط یک سنسور CCD گرفته می‌شود. CCD بصورت ردیفها و ستونهایی از سنسورهای نقطه‌ای نور هستند که به هر کدام از آنها پیکسل گفته میشود.  هر چه تعداد این نقاط بیشتر و فشرده تر باشد، تصویر دارای دقت بالاتری است) هر سنسور نور را به ولتاژی متناسب با درخشندگی نور تبدیل کرده و آن را به بخش تبدیل سیگنالهای آنالوگ به دیجیتال ADC می‌فرستد که در آنجا نوسانات دریافتی از CCD بهکدهای مجزای باینری (عددهای مبنای دو بصورت صفر و یک) تبدیل می‌شود. خروجی دیجیتال از ADC به یک پردازنده سیگنال‌های دیجیتال DSP فرستاده می‌شود که کنتراست و جزئیات تصویر در آن تنظیم می‌شود و قبل از فرستادن تصویر به حافظه برای ذخیره تصویر، اطلاعات را به یک فایل فشرده تبدیل می‌کند. هر چه نور درخشنده‌تر باشد، ولتاژ بالاتری تولید شده و در نتیجه پیکسل‌های رایانه‌ای روشن‌تری ایجاد می‌شود. هر چه تعداد این سنسورها که به‌صورت نقطه هستند بیشتر باشد، وضوح تصویر به دست آمده بیشتر است و جزئیات بیشتری از تصویر گرفته می‌شود.ویکی

از آنجا که تصاویر به طور کلی مربع یا مستطیل شکل  هستند، هر پیکسل ای که از دیجیتال سازی تصویر حاصل می شود، با یک جفت مختصات x و y  با مقادیر خاص نشان داده می شود.  در بسیاری از موارد، محل x به عنوان شماره پیکسل نامیده می شود و موقعیت Y به عنوان شماره خط شناخته می شود. بنابراین یک تصویر دیجیتال از یک آرایه پیکسل مستطیلی (یا مربع) تشکیل شده است که یک مجموعه از مقادیر شدت روشنایی را نشان می دهد 

The sensor array

58

 

می تواند کمتر از یک cm2 باشد

آرایه ای از photosite است.
هر photosite یک سطل از بار الکتریکی است.
آنها با توجه به شدت نور شارژ میشوند.

 

سنسور(ccd)

54

17

هر سنسور یا پیکسل، نور  را به ولتاژی متناسب با درخشندگی نور تبدیل میکند. اگر هر کدام از پیکسل ها را که روی ccd یا سنسور دوربین قرار دارد مانند سطل  و  نوری که از اطراف باید بگیرند مانند بارش باران بدانیم، آنگاه پیکسل دارای نور یا  بار الکتریکی را photosite گویند.

ccd

ccd-RGB

خطای Cannot run turtle module

خطای Cannot run turtle module

Traceback (most recent call last):

File “C:/Python/Python36/turtle2.py”, line 1, in <module>

import turtle as t; t.forward(100)

File “C://Python/Python36\turtle.py”, line 3, in <module>

t=turtle.Turtle()

AttributeError: module ‘turtle’ has no attribute ‘Turtle

این خطا واسه اینه که نباید اسم فایل را turtle میذاشتیم باید اسمشا تغییر میدادیم و اگر تو پوشه یه همچین اسمی داشتیم پاک میکردیم.

 

پایتون

آموزش پایتون_ تابع lambda(ناشناس)

train-your-python-part-14-more-advanced-lists-lambda-and-lambda-operators.w1456

lambda

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

Lambda, filter, reduce and map

 

عملگر(اپراتور) Lambda

 

خوبه بدونید عده ای از لامبدا میترسن، عده ای آن را دوست دارند و عده ای هم از آن متنفرن. مطمئنا در پایان این مطلب عاشق آن میشوید. عملگر لامبدا یا تابع lambda راهی برای ایجاد توابع ناشناس کوچک است، یعنی توابع بدون نام. این توابع چیز بی ممصرفی هستن یعنی فقط در جایی که تعریف میشوند مورد استفاده قرار میگیرند. توابع لامبدا به طور عمده در ترکیب با توابع ()filter(), map و reduce() استفاده میشوند. ویژگی لامبدا به دلیل تقاضای برنامه نویسان Lisp به پایتون اضافه شد.

سینتکس کلی یک تابع لامبدا بسیار ساده است:

lambda argument_list: expression.

argument list   شامل یک لیست از آرگومان جدا شده با کاما است و expression عبارت محاسباتی با استفاده از این آرگومانها است. شما می توانید تابع را به یک متغیر اختصاص دهید تا نامی به آن بدهید.

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

>>> f = lambda x, y : x + y >>> f(1,1) 2

تابع map()

فایده و مزیت عملگر لامبدا زمانی که در ترکیب با map() استفاده می شود، دیده می شود. map () یک تابع با دو آرگومان  است:

r = map(func, seq)

اولین آرگومان func نام یک تابع وآرگومان دوم seq یک دنباله (به عنوان مثال یک لیست) است.

map()، تابع func روی تمام عناصر seg اعمال میکند. . map() یک لیست جدید را با عناصری که توسط func تغییر می کنند، باز می گرداند.

>>> def fahrenheit(T):
return ((float(9)/5)*T + 32)

>>> def celsius(T):
return (float(5)/9)*(T-32)

>>> temp = (36.5, 37, 37.5,39)

>>> F = map(fahrenheit, temp)

>>> C = map(celsius, F)

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

>>> Celsius = [39.2, 36.5, 37.3, 37.8]
>>> Fahrenheit = map(lambda x: (float(9)/5)*x + 32, Celsius)
>>> print (Fahrenheit)
[۱۰۲٫۵۶, ۹۷٫۷۰۰۰۰۰۰۰۰۰۰۰۰۰۳, ۹۹٫۱۴۰۰۰۰۰۰۰۰۰۰۰۰۱, ۱۰۰٫۰۳۹۹۹۹۹۹۹۹۹۹۹۹]
>>> C = map(lambda x: (float(5)/9)*(x-32), Fahrenheit)
>>> print (C)
[۳۹٫۲۰۰۰۰۰۰۰۰۰۰۰۰۰۳, ۳۶٫۵, ۳۷٫۳۰۰۰۰۰۰۰۰۰۰۰۰۰۴, ۳۷٫۷۹۹۹۹۹۹۹۹۹۹۹۹۹۷]
>>> 

map () را می توان به بیش از یک لیست اعمال کرد. لیست ها باید طول یکسان داشته باشند. map () تابع lambda خود را به عناصر لیست های استدلال اعمال می کند، یعنی ابتدا برای عناصر با شاخص ۰، و سپس به عناصر با شاخص اول، تا زمانی که n-th index رسیده است، اعمال می شود:

>>> a = [1,2,3,4]
>>> b = [17,12,11,10]
>>> c = [-1,-4,5,9]
>>> map(lambda x,y:x+y, a,b)
[۱۸, ۱۴, ۱۴, ۱۴]
>>> map(lambda x,y,z:x+y+z, a,b,c)
[۱۷, ۱۰, ۱۹, ۲۳]
>>> map(lambda x,y,z:x+y-z, a,b,c)
[۱۹, ۱۸, ۹, ۵]

ما در مثال بالا می توانیم ببینیم پارامتر x مقادیر خود را از لیست a می گیرد، در حالی که y مقدار آن را از b و z از لیست c دریافت می کند.

Filtering

تابع (filter(function, list  یک روش عالی برای فیلتر کردن تمام عناصر یک لیست ارائه می دهد که عملکرد تابع True را برمیگرداند. تابع( filter(f,l  به عنوان اولین پارامتر، تابع f را  نیاز دارد. f یک مقدار بولین، یعنی درست یا غلط، را برمیگرداند. این تابع به هر عنصر لیست l اعمال خواهد شد. تنها اگر f return True عنصر لیست را در لیست نتیجه قرار دهد.

>>> fib = [0,1,1,2,3,5,8,13,21,34,55]
>>> result = filter(lambda x: x % 2, fib)
>>> print (result)
[۱, ۱, ۳, ۵, ۱۳, ۲۱, ۵۵]
>>> result = filter(lambda x: x % 2 == 0, fib)
>>> print( result)
[۰, ۲, ۸, ۳۴]
>>>

 Reducing a List

توسط تابع (reduce(func, seq،  تابع func  روی دنباله seq پیوسته  اعمال میکند و آن را کاهش میدهد.

>>> reduce(lambda x,y: x+y, [47,11,42,13])
۱۱۳
https://www.python-course.eu/lambda.php

https://www.python-course.eu/lambda.php

 

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

 

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