در آموزش پردازش تصویر با پایتون (Python) توسط OpenCV، شما خواهید آموخت چطور از طریق کتابخانه OpenCV در پایتون (Python)، الگوریتمهای پردازش تصویر را اجرا کنید. اگر مایل هستید درباره OpenCV بیشتر بدانید مقاله “OpenCV چیست” را از دست ندهید.
نکته ۱: بنده کدها را در ژوپیتر اجرا کردهام ولی در این صفحه نحوه نصب و راهاندازی ژوپیتر آموزش داده نشده است. انشالله در پستی دیگر نحوه استفاده از این نرمافزار آموزش داده میشود.
نکته ۲: برای نمایش در برنامه ژوپیتر از کدهای زیر استفاده میکنیم:
from matplotlib import pyplot as plt
import pyplot as plt %matplotlib inline
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
نکته ۳: در صورتی که از ژوپیتر استفاده نمیکنید؛ نیاز به اجرای کدهای فوق نیز ندارید و برای نمایش تصاویر از کد زیر استفاده کنید:
cv2.imshow("Original Image", img)
اوپنسیوی چیست؟ OpenCV کتابخانهای رایگان و متنباز است که برای پردازش تصاویر بلادرنگ مورد استفاده قرار میگیرد. OpenCV برای پردازش تصاویر، فیلمها و حتی پخش زنده کاربردی است. اما شما در این آموزش فقط با پردازش تصاویر آشنا خواهید شد. پیش از شروع اجازه دهید تا OpenCV را نصب کنیم.
فهرست محتوا
بهمنظور نصب OpenCV بر روی سیستمتان، کد pip زیر را اجرا نمایید:
pip install opencv-python
حالا OpenCV با موفقیت نصبشده است و ما آمادهایم. بیایید کمی پردازش تصویر کار کنیم!
در ابتدا ماژول cv2 را وارد کنید.
import cv2
from matplotlib import pyplot as plt
%matplotlib inline
حال بهمنظور خواندن تصویر، توسط متد imread() از ماژول OpenCV، مسیر تصویر را مشخص کنید و مقدار تصویر را مانند زیر بخوانید:
img = cv2.imread("ImageProcessingSample.jpg",1)
تصویر حالا بهعنوان ماتریس ذخیرهشده و مقادیرش در سطرها و ستونهای درون img قابلدستیابی هستند.
در حقیقت اگر شما نوع img را بررسی کنید. با نتیجه زیر روبرو خواهید شد:
print(type(img))
این آرایه NumPy از پایتون است! به خاطر همین پردازش تصویر توسط OpenCV و پایتون بسیار آسان است. همیشه شما در حال کار با آرایههای Numpy هستید.
بهمنظور نمایش تصویر، شما میتوانید از متد imshow() از cv2 استفاده کنید.
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
تابع waitkey وظیفه دارد تا پنجره را پس از تأخیر (بر اساس میلیثانیه) ببندد. در اینجا ما زمان را به صفر تغییر میدهیم که این بدان معنی است که پنجره تا زمانی که بهصورت دستی بسته شود؛ بازخواهد ماند.
برای چرخش تصویر شما نیاز دارید تا عرض و طول تصویر را بدانید. چراکه به این مقادیر بعداً برای فرآیند چرخش نیاز دارید.
height, width = img.shape[0:2]
متد shape طول و عرض ماتریس تصویر را باز میگرداند. اگر شما دستور زیر را چاپ کنید.
img.shape[0:2]
با خروجی زیر روبرو خواهید شد:
خب! حال ما ماتریس تصویر خود را داریم و میخواهیم ماتریس چرخش را به دست آوریم. برای دستیابی به ماتریس چرخش برای پردازش تصویر با پایتون توسط OpenCV، ما از متد getRotationMatrix2D() از cv2 استفاده میکنیم. سینتکس getRotationMatrix2D() بهصورت زیر است:
cv2.getRotationMatrix2D(center, angle, scale)
در اینجا center، مرکز چرخش تصویر است. Angle، زاویه بر اساس درجه و scale، مقیاسی است که تصویر را بر روی صفحه گسترش میدهد.
برای دستیابی به ماتریس چرخش از تصویرمان در پایتون، کد به شکل زیر خواهد بود:
rotationMatrix = cv2.getRotationMatrix2D((width/2, height/2), 90, .5)
گام بعدی چرخش تصویر، استفاده از ماتریس چرخش است.
بهمنظور چرخش تصویر، ما متدی از cv2 به نام wrapAffine داریم که تصویر اصلی، ماتریس چرخش، عرض و طول را دریافت میکند.
rotatedImage = cv2.warpAffine(img, rotationMatrix, (width, height))
تصویر چرخش دادهشده در ماتریس rotatedImage قرار میگیرد. بهمنظور نمایش تصویر از تابع imshow() بهصورت زیر استفاده میگردد:
rotatedImage = cv2.warpAffine(img, rotationMatrix, (width, height))
plt.imshow(cv2.cvtColor(rotatedImage, cv2.COLOR_BGR2RGB))
plt.show()
بعد از اجرای کدهای بالا، شما خروجی زیر را خواهید داشت:
ابتدا ما نیاز داریم که ماژول cv2 از کتابخانههای پایتون (Python) را فراخوانی کنیم و پس از خواندن تصویر، طول و عرض تصویر را استخراجکنیم:
import cv2
import numpy as n from matplotlib
import pyplot as plt %matplotlib inline
img = cv2.imread("ImageProcessingSample.jpg",1)
height, width = img.shape[0:2]
حال ابتدا و انتهای ستون و ردیف موردنظر را تعریف میکنیم. این امر اندازه تصویر جدید را تعریف خواهد کرد. برای مثال: آغاز از ردیف شماره ۱۰ تا ردیف شماره ۱۵ طول تصویر را تعریف خواهد کرد.
بهطور مشابه، شروع از ستون ۱۰ تا ستون ۱۵، عرض تصویر را معین خواهد کرد.
شما میتوانید نقاط ابتدایی را با تعیین درصد مجموع طول و عرض تعیین کنید. بهطور مشابه برای معین کردن نقطه انتهایی از همین روش استفاده کنید. درصد مقادیر را مانند زیر ایجاد کنید:
startRow = int(height*.15)
startCol = int(width*.15)
endRow = int(height*.25)
endCol = int(width*.35)
حالا این مقادیر را برای انجام پردازش تصویر با پایتون توسط OpenCV بر روی تصویر اصلی اعمال میکنیم. توجه داشته باشید که مقادیر آغازین و پایانی را به اعداد صحیح تبدیل میکنیم؛ چراکه مقادیر ایندکس همیشه صحیح هستند.
croppedImage = img[startRow:endRow, startCol:endCol]
حال ما مقادیر آغازین و پایانی از ردیفها و ستونها را مشخص کردیم.
تصویر اصلی و برش دادهشده را در خروجی نمایش میدهیم:
plt.imshow(cv2.cvtColor(croppedImage, cv2.COLOR_BGR2RGB))
plt.show()
نتیجه کد پردازش تصویری پایتون مانند زیر خواهد بود:
شما بهمنظور تغییر اندازه تصویر در OpenCV میتوانید از متد resize() استفاده کنید. در متد resize شما میتوانید مقادیر مختصات x و y یا ردیفها و ستونهایی که اندازه تصویر است را مشخص کنید.
OpenCV را فراخوانی کنید و تصویر را بخوانید:
rotatedImage = cv2.warpAffine(img, rotationMatrix, (width, height))
plt.imshow(cv2.cvtColor(rotatedImage, cv2.COLOR_BGR2RGB))
plt.show()
img = cv2.imread("ImageProcessingSample.jpg",1)
حال از متد resize و مقادیر مختصات استفاده کنید:
newImg = cv2.resize(img, (0,0), fx=0.35, fy=0.35)
plt.imshow(cv2.cvtColor(newImg, cv2.COLOR_BGR2RGB))
plt.show()
نتیجه مانند زیر است:
حال با استفاده از مقادیر سطر و ستون، تصویر را تغییر اندازه میدهیم:
newImg = cv2.resize(img, (155, 135))
plt.imshow(cv2.cvtColor(newImg, cv2.COLOR_BGR2RGB))
plt.show()
ما اعلام میکنیم به ۱۵۵ستون (عرض) و ۱۳۵ردیف (ارتفاع) نیاز داریم.
نتیجه پردازش تصویر با پایتون توسط OpenCV همانند زیر خواهد بود:
در ماژول OpenCV پایتون، تابع خاصی برای تنظیم کانترست تصویر نیست. اما مستندات رسمی OpenCV پیشنهاد میدهد تا از معادله زیر برای تنظیم روشنایی تصویر و کانترست تصویر در یک زمان استفاده کنید.
new_img = a * original_img + b
در اینجا مقدار آلفا، کانترست تصویر را تعریف میکند. اگر a بزرگتر از ۱ باشد؛ کانترست بیشتر خواهد بود. اگر مقدار بین ۰ تا ۱ باشد ( کوچکتر از ۱ اما بزرگتر ۰) دارای کانترست کمتری خواهیم بود. اگر a برابر با ۱ باشد؛ تأثیری بر روی کانترست تصویر وجود نخواهد داشت.
مقدار b نماینده beta است. مقدار میتواند بین -۱۲۷ تا +۱۲۷ متغیر باشد.
بهمنظور اجرای این معادله در OpenCV پایتون، شما میتوانید از تابع addWeighted() استفاده کنید که خروجی آن ۰ تا ۲۵۵ برای تصویر ۲۴-بیت رنگی خواهد بود.
سینتکس addWeighted() بهصورت زیر است:
cv2.addWeighted(source_img1, alpha1, source_img2, alpha2, beta)
این سینتکس در پایتون دو تصویر را با یکدیگر جمع میکند. تصویر اول دارای وزن alpha1 و دومین تصویر (source_img2) است.
اگر میخواهید کانترست را به تصویر اعمال کنید. شما میتوانید تصویر دوم را از ماتریس صفر که با NumPy درست کردهاید؛ استفاده کنید.
برای اجرای این مثال بهصورت ساده، ماژولهای زیر را فراخوانی میکنیم:
import cv2
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
تصویر اصلی را فراخوانی میکنیم:
img = cv2.imread("ImageProcessingSample.jpg",1)
حال تابع کانترست را اعمال میکنیم. ازآنجاییکه ما در اینجا تصویر دیگری نداریم؛ ما از np.zeros استفاده میکنیم که آرایهای مشابه با شکل و نوع دادههای تصویر اصلی ایجاد میکند؛ ولی آرایه با صفر پر میشود.
contrast_img = cv2.addWeighted(img, 2.5, np.zeros(img.shape, img.dtype), 0, 0)
plt.imshow(cv2.cvtColor(contrast_img, cv2.COLOR_BGR2RGB))
plt.show()
در کد بالا میزان روشنایی (brightness) بهاندازه ۰ تنظیمشده است. چراکه ما تنها میخواهیم کانترست را اعمال میکنیم.
مقایسه بین تصویر اصلی و کانترست مانند زیر است:
بهمنظور مات کردن تصویر در پایتون، شما میتوانید از متد GaussianBlur() از OpenCV استفاده کنید.
متد GaussianBlur() از کرنل گوسی استفاده میکند. عرض و ارتفاع کرنل باید مثبت و فرد باشند.
بعد باید جهت X و Y را با توجه به sigmaX و sigmaY مشخص کنیم. اگر فقط یک مشخص شود؛ هر دو یکسان در نظر گرفته میشوند.
مثال زیر را در نظر بگیرید:
import cv2
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
img = cv2.imread("ImageProcessingSample.jpg",1)
blur_image = cv2.GaussianBlur(img, (9,9), 0)
plt.imshow(cv2.cvtColor(blur_image, cv2.COLOR_BGR2RGB))
plt.show()
در تکه کد بالا، تصویر به متد GaussianBlur() به همراه عرض و ارتفاع کرنل و جهتهای y و x فرستاده میشود.
مقایسه بین تصویر اصلی و مات در پردازش تصویر با پایتون توسط OpenCV همانند زیر خواهد بود:
در فیلتر میانه، میانه تمامی پیکسلهای تصویر درون محدوده کرنل محاسبه میگردد. مقدار مرکزی سپس با مقدار محاسبهشده میانه، جایگزین میشود. مات کردن میانه در مکانهایی که دارای نویز نمک و فلفل هستیم؛ میتواند مورد استفاده قرار میگیرد.
برای اعمال مات کردن میانه، شما میتوانید از متد medianBlur() از OpenCV استفاده کنید.
مثال زیر را در نظر بگیرید:
import cv2
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
img = cv2.imread("ImageProcessingSample.jpg")
blur_image = cv2.medianBlur(img,5)
حال تصویر را نمایش میدهیم:
plt.imshow(cv2.cvtColor(blur_image, cv2.COLOR_BGR2RGB))
plt.show()
نتیجه مانند زیر خواهد بود:
شما بهمنظور تشخیص لبهها در تصویر از طریق پردازش تصویر و پایتون (Python) میتوانید از متد Canny() از cv2 استفاده کنید که آشکارساز لبه Canny را پیادهسازی میکند. آشکارساز لبه Canny همچنین بهعنوان آشکارساز بهینه نیز شناخته میشود.
سینتکس Canny() مانند زیر است:
cv2.Canny(image, minVal, maxVal)
در اینجا minVal و maxVal مقادیر کمینه و بیشینه، مقادیر شدت روشنایی خاکستری متناظر است.
کد زیر را در نظر بگیرید:
import cv2
from matplotlib import pyplot as plt
%matplotlib inline
img = cv2.imread("ImageProcessingSample.jpg")
edge_img = cv2.Canny(img,100,200)
plt.imshow(cv2.cvtColor(edge_img, cv2.COLOR_BGR2RGB))
plt.show()
خروجی همانند زیر خواهد بود:
راحتترین راه تبدیل عکس به خاکستری در پردازش تصویر با پایتون توسط OpenCV استفاده از روش زیر است:
img0 = cv2.imread("ImageProcessingSample.jpg",0)
متد دیگر استفاده از BGR2Gray است.
برای تبدیل تصویر رنگی به تصویر خاکستری، از مشخصه BGR2GRAY از ماژول cv2 استفاده میکنیم. این امر در مثال زیر نشان دادهشده است.
ماژول cv2 را وارد کنید.
import cv2
from matplotlib import pyplot as plt
%matplotlib inline
تصویر را بخوانید:
img = cv2.imread("ImageProcessingSample.jpg",1)
از متد cvtColor() از ماژول cv2 پایتون استفاده میکنیم که تصویر اصلی و مشخصه COLOR_BGR2GRAY را بهعنوان آرگومان دریافت میکند. و نهایتاً تصویر نتیجه را در یک متغیر ذخیره میکنیم.
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
تصویر اصلی و سیاهوسفید را نمایش میدهیم:
plt.imshow(cv2.cvtColor(gray_img, cv2.COLOR_BGR2RGB))
plt.show()
خروجی مانند زیر خواهد بود:
گام اول برای تشخیص مرکز تصویر، تبدیل تصویر به خاکستری است. ما میتوانیم از متد cvtColor() از ماژول cv2 مانند آنچه قبل انجام دادهایم؛ استفاده کنیم.
این امر در کدهای زیر نمایش دادهشدهاند:
import cv2
from matplotlib import pyplot as plt
%matplotlib inline
img = cv2.imread("centroid-blob-image.png")
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ما تصویر را میخوانیم و به تصویر خاکستری تبدیل میکنیم. عکس جدید در gray_img ذخیره میشود.
حال ما باید مراکز ثقل تصویر را محاسبه کنیم. با استفاده از متد moments() از cv2 این امر محقق میشود. در متد moments() از تصویر خاکستری همانند زیر استفاده میشود:
moment = cv2.moments(gray_img)
حال نیاز است تا مرکز مختصات x و y تصویر را با نقاط ثقل محاسبهشده از بالا محاسبه کنیم:
X = int(moment ["m10"] / moment["m00"])
Y = int(moment ["m01"] / moment["m00"])
سرانجام ما نقطه مرکزی تصویر را داریم. برای نشانگذاری موقعیت مرکزی، ما میتوانیم از متد circle برای ایجاد دایره در مختصات دادهشده با شعاع تعریفشده استفاده کنیم.
متد circle() تصویر img، مختصات x و y جایی که دایره ایجاد خواهد کرد. اندازه، رنگ دایره که ما به آن نیاز داریم به همراه ضخامت.
cv2.circle(img, (X, Y), 15, (205, 114, 101), 10)
دایره بر روی تصویر ایجاد میشود.
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
تصویر اصلی بهصورت زیر است:
پس از تشخیص مرکز، تصویر مانند زیر خواهد بود:
ماسک گذاری تصویر در پردازش تصویر به معنای اعمال و استفاده از تصویری دیگر بر روی تصویر اصلی بهمنظور تغییر مقادیر پیکسل تصویر است.
برای اعمال ماسک به تصویر ما از متد HoughCircles() از ماژول OpenCV استفاده میکنیم. متد HoughCircles() دایرههای درون تصویر را تشخیص میدهد. پس از تشخیص دایرهها، ما میتوانیم ماسک را بر روی این دایرهها اعمال کنیم.
متد HoughCircles() تصویر اصلی، گرادیان هاف (که مشخصکننده دادههای گرادیان لبههای دایره است* و اطلاعات معادله دایره را دریافت میکند.
(x – xcenter)2 + (y – ycenter)2 = r2
در این معادله (xcenter , ycenter) مرکز دایره و r شعاع دایره هستند.
تصویر اصل ما بهصورت زیر است:
خب، حالا ما دایرهها را درون تصویر داریم و میتوانیم ماسک را اعمال کنیم. کد زیر را در نظر بگیرید:
import cv2
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
img = cv2.imread("ImageProcessingSample.jpg")
img1 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
تشخیص دایرههای تصویر توسط HoughCircles() کد از OpenCV: Hough Circle Transform
gray_img = cv2.medianBlur(cv2.cvtColor(img, cv2.COLOR_RGB2GRAY), 3)
circles = cv2.HoughCircles(gray_img, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=50, minRadius=0, maxRadius=0)
circles = np.uint16(np.around(circles))
بهمنظور ایجاد ماسک از np.full استفاده میکنیم که آرایه NumPy با شکل دادهشده را ایجاد میکند:
masking=np.full((img1.shape[0], img1.shape[1]),0,dtype=np.uint8)
for j in circles[0, :]:
cv2.circle(masking, (j[0], j[1]), j[2], (255, 255, 255), -1)
گام بعدی ترکیب تصویر و آرایه ماسکی است که ما توسط عملگر bitwise_or بهصورت زیر درست کردیم:
final_img = cv2.bitwise_or(img, img1, masking=masking)
نمایش تصویر نتیجه:
بهمنظور استخراج متن انگلیسی از تصویر، شما میتوانید از Google Tesseract-OCR استفاده کنید. شما میتوانید این افزونه را برای پردازش تصویر با پایتون توسط OpenCV از لینک زیر دانلود کنید.
https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-setup-3.05.02-20180621.exe
پسازآن شما باید ماژول pytesseract که wrapper پایتون برای Tesseract-OCR استفاده کنید.
pip install pytesseract
تصویری که ما متن را از آن استخراج خواهیم کرد بهصورت زیر خواهد بود:
حالا اجازه بدهید تا متن درون تصویر را به رشته کاراکترها تبدیل کنیم و متن را بهعنوان رشته در خروجی نمایش بدهیم:
ماژول pytesseract را وارد میکنیم:
import pytesseract
مسیر فایل اجرایی Tesseract-OCR را مشخص میکنیم:
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files (x86)\Tesseract-OCR\tesseract'
حال از متد image_to_string بهمنظور تبدیل عکس به رشته استفاده میکنیم:
print(pytesseract.image_to_string('BarmanOCR.jpg'))
خروجی مانند زیر خواهد بود:
BarmanVision: Digital image processing is the use of a digital computer to process digital images through an algorithm.[1][2] As a subcategory or field of digital signal processing, digital image processing has many advantages over analog image processing. It allows a much wider range of algorithms to be applied to the input data and can avoid problems such as the build-up of noise and distortion during processing.
کار کردن با این ماژول مثل هلو است!
ما در این بخش چرخش متن را اصلاح میکنیم.
تصویر اصلی بهصورت زیر است:
ماژول cv2و NumPy را وارد میکنیم و تصویر را میخوانیم:
import cv2
from matplotlib import pyplot as plt
%matplotlib inline
img = cv2.imread("BarmanOCR-Rotated.jpg")
تصویر را به تصویر خاکستری تبدیل میکنیم:
gray_img=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
تصویر خاکستری را توسط متد bitwise_not معکوس مینماییم:
gray_img=cv2.bitwise_not(gray_img)
مختصات x و y از پیکسلهایی که بزرگتر از صفر هستند را توسط متد column_stack از NumPy انتخاب میکنیم:
coordinates = np.column_stack(np.where(gray_img > 0))
حال ما زاویه چرخش را باید محاسبه کنیم. ما از متد minAreaRect() از ماژول cv2 استفاده خواهیم کرد که طیف زاویهای بین -۹۰ تا ۰ درجه (شامل ۰ نیست) را بازخواهد گرداند.
ang=cv2.minAreaRect(coordinates)[-1]
زاویه چرخش محدوده متن درون متغیر ang ذخیره خواهد شد. حال ما یک شرط برای زاویه اضافه میکنیم؛ اگر محدوده متن کوچکتر از -۴۵ باشد ما ۹۰ درجه اضافه خواهیم کرد در غیر این صورت زاویه را در منفی ضرب خواهیم کرد تا زاویه مثبت شود.
if ang<-45:
ang=-(90+ang)
else:
ang=-ang
محاسبه مرکز محدوده متن:
height, width = img.shape[:2]
center_img = (width / 2, height / 2)
حال زاویه چرخش متن را داریم. توسط متد getRotationMatrix2D() ماتریس چرخش را به دست خواهیم آورد و با استفاده از متد wrapAffine() چرخش را با زاویه مشخص انجام میدهیم.
rotationMatrix = cv2.getRotationMatrix2D(center_img, ang, 1.0)
rotated_img = cv2.warpAffine(img, rotationMatrix, (width, height), borderMode = cv2.BORDER_REFLECT)
نمایش تصویر چرخش دادهشده:
cv2.imshow("Rotated Image", rotated_img)
cv2.waitKey(0)
بیایید رنگ سبز تصویر را تشخیص بدهیم:
ماژول cv2 برای تصاویر و NumPy برای آرایه تصاویر را وارد میکنیم:
import cv2
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
عکس را میخوانیم و آن را به فضای HSV توسط cvtColor() انتقال میدهیم:
img = cv2.imread("colorImage.jpg")
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
نمایش تصویر:
plt.imshow(cv2.cvtColor(hsv_img, cv2.COLOR_BGR2RGB))
plt.show()
حال آرایه NumPy را برای مقادیر پایین و بالای سبز ایجاد میکنیم:
lower_green = np.array([34, 177, 76])
upper_green = np.array([255, 255, 255])
با استفاده از متد inRange() از ماژول cv2 بررسی میکنیم که کدامیک از المانهای تصویر بین مقادیر بالا و پایین مشخصشده است:
masking = cv2.inRange(hsv_img, lower_green, upper_green)
بدینوسیله رنگ سبز را تشخیص میدهیم.
نهایتاً تصویر نتیجه و اصلی را به نمایش میگذاریم:
cv2.imshow("Original Image", img)
cv2.imshow("Green Color detection", Filtered Image)
بهمنظور کاهش نویز تصویر، OpenCV دارای متدهای زیر است:
۱.متد fastNlMeansDenoising(): حذف نویز از تصویر خاکستری
۲.متد fastNlMeansDenoisingColored(): حذف نویز از تصویر رنگی
۳.متد fastNlMeansDenoisingMulti(): حذف نویز از فریم تصاویر خاکستری (فیلم در مقیاس خاکستری)
۴.متد fastNlMeansDenoisingColoredMulti(): مشابه مورد ۳ اما این بار برای تصاویر رنگی
بیایید از متد fastNlMeansDenoisingColoredMulti در مثالمان استفاده کنیم:
ماژول cv2 را وارد کنید و تصویر را بخوانید:
import cv2
import numpy as n
from matplotlib import pyplot as plt
%matplotlib inline
فیلتر حذف نویز را به تصویر اعمال میکنیم که تبع آن تصویر اصلی (src)، مقصد، قدرت فیلتر، مقدار تصویر برای حذف نویز رنگی (معمولاً برابر با قدرت فیلتر یا ۱۰)، اندازه تمپلیت در پیکسل بهمنظور محاسبه وزنها که همیشه باید فرد باشد (وزن پیشنهادشده ، ۷ است) و اندازه ویندوز در پیکسل برای محاسبه میانگین پیکسل دادهشده.
result = cv2.fastNlMeansDenoisingColored(img,None,20,10,7,21)
نمایش تصویر اصلی و حذف نویز شده:
plt.imshow(cv2.cvtColor(result, cv2.COLOR_BGR2RGB))
plt.show()
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
خروجی مانند زیر خواهید بود:
خطوط مرزی، منحنیهایی از تصویر هستند که به یکدیگر متصل شدهاند. منحنیها نقاط پیوسته متصل در یک تصویر است.هدف کانتورها تشخیص اشیا است.
تصویر اصلی که ما خواهان استخراج خطوط مرزی و اعمال پردازش تصویر با پایتون و OpenCV هستیم:
کد زیر را در نظر بگیرید جایی که ما از متد findContours() استفاده کردهایم تا کانتورها در تصویر را استخراجکنیم:
ماژول cv2 را وارد میکنیم:
import cv2
تصویر را میخوانیم و تصویر را به تصویر خاکستری تبدیل میکنیم
img = cv2.imread('py1.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
حد آستانه (threshold) را پیدا میکنیم:
retval, thresh = cv2.threshold(gray_img, 127, 255, 0)
از findContours() استفاده میکنیم که تصویر (اینجا threshold) و چند ویژگی است. برای اطلاع بیشتر مستند رسمی این متد را مشاهده بفرمایید.
https://docs.opencv.org/3.4.2/d3/dc0/group__imgproc__shape.html#ga17ed9f5d79ae97bd4c7cf18403e1689a
img_contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
کانتورها را بر روی تصویر با متد drawContours() رسم مینماییم:
cv2.drawContours(img, img_contours, -1, (0, 255, 0))
نمایش تصویر:
cv2.imshow('Image Contours', img)
cv2.waitKey(0)
نتیجه مانند زیر خواهد بود:
برای حذف پسزمینه ما ابتدا لبههای اشیا اصلی را تشخیص میدهیم و ماسکی با np.zeros برای پسزمینه و سپس ترکیب ماسک و تصویر را توسط bitwise_and انجام خواهیم داد.
مثال زیر را مد نظر قرار دهید:
ماژول (NumPy and cv2) را وارد میکنیم:
import cv2
import numpy as np
خواندن تصویر و تبدیل تصویر به مقیاس خاکستری:
img = cv2.imread("py.jpg")
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
پیدا کردن حد آستانه (threshold):
_, thresh = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
آخرین المان متد threshold() سبک threshold را تعریف میکند. مستند رسمی OpenCV threshold را ببینید.
کانتورهای تصویر را پیدا کنید:
img_contours = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)[-2]
کانتورها را سورت میکنیم:
img_contours = sorted(img_contours, key=cv2.contourArea)
for i in img_contours:
if cv2.contourArea(i) > 100:
break
ماسکی توسط np.zeros ایجاد میکنیم:
mask = np.zeros(img.shape[:2], np.uint8)
کانتورها را رسم میکنیم:
cv2.drawContours(mask, [i],-1, 255, -1)
عملگر bitwise_and را اعمال میکنیم:
new_img = cv2.bitwise_and(img, img, mask=mask)
نمایش تصویر اصلی:
cv2.imshow("Original Image", img)
نمایش تصویر نتیجه:
cv2.imshow("BG Removed", new_img)
cv2.waitKey(0)
در مطلب آماده شده شما قادر خواهید بود تا روش دریافت تصویر در کد پایتون و انجام پردازشهای احتمالی از طریق OpenCV را فرابگیرید. برای کسب اطلاعات بیشتر به صفحه مربوطه رجوع کنید.
پردازش تصویر با OpenCV و پایتون (Python) لذتبخش است. منتظر نظرات خوبتان هستم. امیدوارم این آموزش در پیشبرد اهدافتان به شما کمک کرده باشد.
توجه داشتهباشید که برای تدوین مطالب سایت زحمت بسیاری کشیده شده است. لذا استفاده از مطالب سایت تنها با ذکر منبع مجاز است.
2 Comments
بسیار عالی
مختصر و مفید، واقعا عالی بود. ممنون