بارمان ویژنcropped-BARMAN-VISION-ICO-LOGO.pngبارمان ویژنبارمان ویژن
  • آموزشگاه بینایی
  • پروژه‌ها
  • تجهیزات بینایی ماشین
    • دوربین اسکن خطی
    • دوربین مینیاتوری
      • دوربین ‌GigE مینیاتوری
      • دوربین USB3 مینیاتوری
      • دوربین ‌USB2 مینیاتوری
    • دوربین ‌پزشکی
  • راهکار بینایی
  • بلاگ
✕

آموزش پردازش تصویر با پایتون توسط OpenCV

  • صفحه اصلی
  • آموزش پردازش تصویر ‌‌OpenCV
  • آموزش پردازش تصویر با پایتون توسط OpenCV
image processing industry4
پردازش تصویر صنعتی در خطوط تولید
۲۱ اسفند ۱۳۹۹
what-is-digtal-image-processing
مبانی پردازش تصویر دیجیتال
۱۵ اردیبهشت ۱۴۰۰
منتشر شده توسط محمد کیانی در ۰۴ اردیبهشت ۱۴۰۰
موضوعات
  • ‌‌OpenCV
برچسب‌ها
  • image processing
  • industrial image processing
  • opencv
  • python
  • اوپن‌سی‌وی
  • پایتون
  • پردازش تصویر
Python Image Processing with OpenCV

در آموزش پردازش تصویر با پایتون (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
  • چرخش تصویر
  • برش تصویر
  • تغییر اندازه تصویر
  • تنظیم کانترست تصویر
  • مات کردن تصویر
      • فیلتر گوسی
      • فیلتر میانه
  • تشخیص لبه‌ها
  • تبدیل تصویر به خاکستری (سیاه‌وسفید)
  •  تشخیص مرکز (مرکز بلاب)
  • اعمال ماسک به تصویر رنگی
  • استخراج متن از تصویر (OCR)
  • تشخیص و اصلاح متن زاویه‌دار
  • تشخیص رنگ
  • کاهش نویز
  • دریافت کانتور (خطوط مرزی) تصویر
  • حذف پس‌زمینه از تصویر
  • دریافت تصویر دوربین صنعتی ZDS از طریق پایتون

نصب OpenCV

به‌منظور نصب OpenCV بر روی سیستمتان، کد pip زیر را اجرا نمایید:

 
				
					pip install opencv-python
				
			

installing opencv in 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))
<class 'numpy.ndarray'>
				
			

این آرایه NumPy از پایتون است! به خاطر همین پردازش تصویر توسط OpenCV و پایتون بسیار آسان است. همیشه شما در حال کار با آرایه‌های Numpy هستید.

به‌منظور نمایش تصویر، شما می‌توانید از متد imshow() از cv2 استفاده کنید.

				
					plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()
				
			

تابع waitkey وظیفه دارد تا پنجره را پس از تأخیر (بر اساس میلی‌ثانیه) ببندد. در اینجا ما زمان را به صفر تغییر می‌دهیم که این بدان معنی است که پنجره تا زمانی که به‌صورت دستی بسته شود؛ بازخواهد ماند.

Image Processing Sample Original

برای چرخش تصویر شما نیاز دارید تا عرض و طول تصویر را بدانید. چراکه  به این مقادیر بعداً برای فرآیند چرخش نیاز دارید.

				
					height, width = img.shape[0:2]
				
			

متد shape طول و عرض ماتریس تصویر را باز می‌گرداند. اگر شما دستور زیر را چاپ کنید.

				
					img.shape[0:2]
				
			

با خروجی زیر روبرو خواهید شد:

Image Processing Rotate shape size

خب! حال ما ماتریس تصویر خود را داریم و می‌خواهیم ماتریس چرخش را به دست آوریم. برای دستیابی به ماتریس چرخش برای پردازش تصویر با پایتون توسط 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()
				
			

بعد از اجرای کدهای بالا، شما خروجی زیر را خواهید داشت:

Rotation

برش تصویر

ابتدا ما نیاز داریم که ماژول 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()
				
			

نتیجه کد پردازش تصویری پایتون مانند زیر خواهد بود:

cropped image by OpenCV

تغییر اندازه تصویر

شما به‌منظور تغییر اندازه تصویر در 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()
				
			

نتیجه مانند زیر است:

resize an image by opencv

حال با استفاده از مقادیر سطر و ستون، تصویر را تغییر اندازه می‌دهیم:

				
					newImg = cv2.resize(img, (155, 135))
plt.imshow(cv2.cvtColor(newImg, cv2.COLOR_BGR2RGB))
plt.show()
				
			

ما اعلام می‌کنیم به ۱۵۵ستون (عرض) و ۱۳۵ردیف (ارتفاع) نیاز داریم.

نتیجه پردازش تصویر با پایتون توسط OpenCV همانند زیر خواهد بود:

resize an image by pencv-python

تنظیم کانترست تصویر

در ماژول 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) به‌اندازه ۰ تنظیم‌شده است. چراکه ما تنها می‌خواهیم کانترست را اعمال می‌کنیم.

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

change contrast by opencv-python

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

فیلتر گوسی

به‌منظور مات کردن تصویر در پایتون، شما می‌توانید از متد 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 همانند زیر خواهد بود:

gaussian filter by opencv-python

فیلتر میانه

در فیلتر میانه، میانه تمامی پیکسل‌های تصویر درون محدوده کرنل محاسبه می‌گردد. مقدار مرکزی سپس با مقدار محاسبه‌شده میانه، جایگزین می‌شود. مات کردن میانه در مکان‌هایی که دارای نویز نمک و فلفل هستیم؛ می‌تواند مورد استفاده قرار می‌گیرد.

برای اعمال مات کردن میانه، شما می‌توانید از متد 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()
				
			

نتیجه مانند زیر خواهد بود:

median filter by opencv and python

تشخیص لبه‌ها

شما به‌منظور تشخیص لبه‌ها در تصویر از طریق پردازش تصویر و پایتون (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()
				
			

خروجی همانند زیر خواهد بود:

edge detection by opencv and python

تبدیل تصویر به خاکستری (سیاه‌وسفید)

راحت‌ترین راه تبدیل عکس به خاکستری در پردازش تصویر با پایتون توسط 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()
				
			

خروجی مانند زیر خواهد بود:

convert color image to grayscale

 تشخیص مرکز (مرکز بلاب)

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

تصویر اصلی به‌صورت زیر است:

blob for image processing

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

processed image centroid

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

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

برای اعمال ماسک به تصویر ما از متد HoughCircles() از ماژول OpenCV استفاده می‌کنیم. متد HoughCircles() دایره‌های درون تصویر را تشخیص می‌دهد. پس از تشخیص دایره‌ها، ما می‌توانیم ماسک را بر روی این دایره‌ها اعمال کنیم.

متد HoughCircles() تصویر اصلی، گرادیان هاف (که مشخص‌کننده داده‌های گرادیان لبه‌های دایره است* و اطلاعات معادله دایره را دریافت می‌کند.

(x – xcenter)2 + (y – ycenter)2 = r2

در این معادله (xcenter , ycenter) مرکز دایره و r شعاع دایره هستند.

تصویر اصل ما به‌صورت زیر است:

Image Processing Sample Original

خب، حالا ما دایره‌ها را درون تصویر داریم و می‌توانیم ماسک را اعمال کنیم. کد زیر را در نظر بگیرید:

				
					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

https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_houghcircles/py_houghcircles.html

				
					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)
				
			

نمایش تصویر نتیجه:

masked image

استخراج متن از تصویر (OCR)

به‌منظور استخراج متن انگلیسی از تصویر، شما می‌توانید از 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
				
			

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

barman image processing ocr

حالا اجازه بدهید تا متن درون تصویر را به رشته کاراکترها تبدیل کنیم و متن را به‌عنوان رشته در خروجی نمایش بدهیم:

ماژول 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.

کار کردن با این ماژول مثل هلو است!

تشخیص و اصلاح متن زاویه‌دار

ما در این بخش چرخش متن را اصلاح می‌کنیم.

تصویر اصلی به‌صورت زیر است:

ocr rotation

ماژول 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)
				
			

rotated text

تشخیص رنگ

بیایید رنگ سبز تصویر را تشخیص بدهیم:

Color Image

ماژول 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()
				
			

HSV Image

حال آرایه 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)
				
			

Color Detection

کاهش نویز

به‌منظور کاهش نویز تصویر، 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()
				
			

Image with Noise

خروجی مانند زیر خواهید بود:

denoised image

دریافت کانتور (خطوط مرزی) تصویر

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

تصویر اصلی که ما خواهان استخراج خطوط مرزی و اعمال پردازش تصویر با پایتون و OpenCV هستیم:

contour detection

کد زیر را در نظر بگیرید جایی که ما از متد 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)
				
			

نتیجه مانند زیر خواهد بود:

finding contour

حذف پس‌زمینه از تصویر

برای حذف پس‌زمینه ما ابتدا لبه‌های اشیا اصلی را تشخیص می‌دهیم و ماسکی با 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)
				
			

Barman BG

نمایش تصویر نتیجه:

 
				
					cv2.imshow("BG Removed", new_img)
cv2.waitKey(0)
				
			

removing background

دریافت تصویر دوربین صنعتی ZDS از طریق پایتون

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

پردازش تصویر با OpenCV و پایتون (Python) لذت‌بخش است. منتظر نظرات خوبتان هستم. امیدوارم این آموزش در پیشبرد اهدافتان به شما کمک کرده باشد.

توجه داشته‌باشید که برای تدوین مطالب سایت زحمت بسیاری کشیده شده است. لذا استفاده از مطالب سایت تنها با ذکر منبع مجاز است.

اشتراک گذاری
2
محمد کیانی
محمد کیانی

مطالب مرتبط

۳۰ مرداد ۱۴۰۰

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


اطلاعات بیشتر
face detection
۰۳ مرداد ۱۴۰۰

تشخیص چهره توسط پایتون با کمتر از ۲۵ خط کد


اطلاعات بیشتر
OpenCV features
۰۲ مرداد ۱۴۰۰

OpenCV چیست؟


اطلاعات بیشتر

2 Comments

  1. محمد شکاری گفت:
    ۲۴ آذر ۱۴۰۰ در ۶:۴۴ ق.ظ

    بسیار عالی

    پاسخ
  2. عرفان گفت:
    ۲۹ بهمن ۱۴۰۰ در ۱۲:۱۵ ق.ظ

    مختصر و مفید، واقعا عالی بود. ممنون

    پاسخ

دیدگاهتان را بنویسید لغو پاسخ

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *


The reCAPTCHA verification period has expired. Please reload the page.

گروه بارمان ویژن

افتخار داریم که فعالیتمان در زمینه بینایی ماشین، از سال ۱۳۹۴ آغاز شده است. در این مدت گام‌های موفقیت را آهسته و پیوسته برداشته‌ایم و به جایگاه حاضر رسیده‌ایم. در حال حاضر به عنوان تأمین‌کننده تجهیزات، طراح و مشاور در کنار شما هستیم و به مجریان بینایی ماشین مشاوره‌های لازم داده می‌شود؛ تولیدکنندگان گرامی ایران و ارمنستان نیز از سامانه‌های بینایی ماشین ما بهره‌برده‌اند.
پردازش تصویر توسط دوربین‌های صنعتی تخصص ماست.

نوشته‌های تازه

  • آموزش اتصال به دوربین صنعتی ZDS از طریق Python و OpenCV
  • واژگان و اصطلاحات یادگیری عمیق
  • دوربین Datalogic
  • Data Matrix (ECC200)
  • ماژول LabVIEW Vision Development

ارتباط با ما

آدرس:
اصفهان، خیابان جی شرقی، ارغوانیه، بلوار دانشگاه،  دانشگاه آزاد اسلامی واحد اصفهان، مرکز رشد واحدهای فناور، واحد ۵
اطلاعات تماس:
تلفن و واتساپ
۰۳۱۳۵۰۰۲۷۷۳
۰۹۰۲۴۰۰۴۴۸۰


تمام حق و حقوق محفوظ است.