Contour Features

  • مدرس: علی بیگدلی
  • تاریخ انتشار: Sep 05, 2020

اهدف

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

1. Moments

moment های تصویر به شما کمک می کند تا برخی از ویژگی ها مانند مرکز، جرم جسم ، مساحت جسم و غیره را محاسبه کنید.

تابع cv.moments () فرهنگ لغت کلیه مقادیر moment محاسبه شده را می دهد:

import numpy as np
import cv2
img = cv2.imread('star.jpg',0)
ret,thresh = cv2.threshold(img,127,255,0)
contours,hierarchy = cv2.findContours(thresh, 1, 2)
cnt = contours[0]
M = cv2.moments(cnt)
print( M )

برای گرفتن مرکز طول و عرض تصویر فقط کافیست که از فرمول زیر استفاده نمایید:

cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])

2. Contour Area

ناحیه کانتور با تابع cv.contourArea () یا از لحظه ها ، M ['m00'] داده می شود.

area = cv2.contourArea(cnt)

3. Contour Perimeter

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

perimeter = cv2.arcLength(cnt,True)

4. Contour Approximation

بسته به دقتی که مشخص مي کنيم ، شکل کانتور را به شکل ديگري با تعداد کمتر راس تقريب مي کند. که اسم آنالگوریتم داگلاس-پوکر است.

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

epsilon = 0.1*cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True)

در زیر ، در تصویر دوم ، خط سبز منحنی تقریبی epsilon = 10٪ طول قوس را نشان می دهد. تصویر سوم برای epsilon = 1٪ طول قوس را نشان می دهد. آرگومان سوم مشخص می کند که منحنی بسته است یا خیر.

5. Convex Hull

ظاهر convex hull  شبیه تقریب کانتور است ، اما اینگونه نیست (هر دو ممکن است در بعضی موارد نتایج یکسانی را ارائه دهند). در اینجا ، تابع cv.convexHull یک منحنی را برای نقص های تحدب بررسی می کند و آن را تصحیح می کند. به طور کلی ، منحنی های محدب منحنی هایی هستند که همیشه بیرون زده یا حداقل صاف هستند. و اگر در داخل آن برجسته باشد ، به آن نقص تحدب گفته می شود. به عنوان مثال ، تصویر زیر را از دست بررسی کنید. خط قرمز بدنه محدب را نشان می دهد. علامت های فلش دو طرفه نقایص تحدب را نشان می دهد ، که حداکثر انحرافات محلی بدنه از خطوط است.

درباره نحو آن می توان موارد کمی راجع به آن بحث کرد:

hull = cv2.convexHull(points[, hull[, clockwise[, returnPoints]]

جزئیات استدلال:

  • points خطوطی هستند که ما از آنها عبور می کنیم.
  • hull خروجی است ، به طور معمول ما از آن جلوگیری می کنیم.
  • clockwise : پرچم جهت گیری. اگر درست باشد ، بدنه محدب خروجی در جهت عقربه های ساعت جهت دارد. در غیر این صورت ، جهت گیری آن در خلاف جهت عقربه های ساعت است.
  • returnPoints : به طور پیش فرض ، درست است. سپس مختصات نقاط بدنه را برمی گرداند. اگر False باشد ، شاخص های نقاط کانتور مربوط به نقاط بدنه را برمی گرداند.

بنابراین برای بدست آوردن بدنه محدب مانند تصویر بالا ، موارد زیر کافی است:

hull = cv2.convexHull(cnt)

اما اگر می خواهید نقص های تحدب پیدا کنید ، باید ReturnPoints = False را رد کنید. برای درک آن ، تصویر مستطیل بالا را می گیریم. ابتدا کانتور آن را به صورت cnt پیدا کردم. اکنون بدنه محدب آن را با returnPoints پیدا کردم = درست است ، مقادیر زیر را بدست آوردم: [[[234 202]]، [[51 202]]، [[51 79]]، [[234 79]]] که چهار گوشه هستند نقاط مستطیل. اکنون اگر همین کار را با returnPoints = False انجام دهید ، نتیجه زیر را بدست می آورم: [[129] ، [67] ، [0] ، [142]]. این شاخص های نقاط مربوطه در خطوط است. به عنوان مثال ، مقدار اول را بررسی کنید: cnt [129] = [[234 ، 202]] که همان نتیجه اول است (و برای دیگران به همین ترتیب).

وقتی در مورد نقص تحدب بحث کنیم دوباره آن را خواهید دید.

6. Checking Convexity

تابعی وجود دارد که بررسی می کند منحنی محدب است یا نه ، cv.isContourConvex (). فقط درست یا نادرست برمی گردد. مسئله بزرگی نیست.

k = cv2.isContourConvex(cnt)

 

7. Bounding Rectangle

مستطیل های مرزی دو نوع هستند.

 Straight Bounding Rectangle

این یک مستطیل مستقیم است ، چرخش جسم را در نظر نمی گیرد. بنابراین مساحت مستطیل محدود کننده حداقل نخواهد بود. با تابع cv.boundingRect () پیدا می شود.

(x، y) مختصات بالا و سمت چپ مستطیل و (w ، h) عرض و ارتفاع آن باشد.

x,y,w,h = cv.boundingRect(cnt)
cv.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)

 

 Rotated Rectangle

در اینجا ، مستطیل محدود با حداقل مساحت ترسیم شده است ، بنابراین چرخش را نیز در نظر می گیرد. تابع مورد استفاده cv.minAreaRect () است. این یک ساختار Box2D را برمی گرداند که شامل جزئیات زیر است - (مرکز (x ، y) ، (عرض ، ارتفاع) ، زاویه چرخش). اما برای رسم این مستطیل به 4 گوشه مستطیل نیاز داریم. توسط تابع cv.boxPoints () بدست می آید

rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(img,[box],0,(0,0,255),2)

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

 

8. Minimum Enclosing Circle

بعد با استفاده از تابع cv.minEnclosingCircle () دایره دائمی یک شی را پیدا می کنیم. این یک دایره است که کاملاً جسم را با حداقل مساحت پوشش می دهد.

(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
cv2.circle(img,center,radius,(0,255,0),2)

 

9. Fitting an Ellipse

مورد بعدی قرار دادن بیضی در یک جسم است. مستطیل چرخشی را که بیضی در آن نقش بسته است برمی گرداند.

 

10. Fitting a Line

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

rows,cols = img.shape[:2]
[vx,vy,x,y] = cv.fitLine(cnt, cv2.DIST_L2,0,0.01,0.01)
lefty = int((-x*vy/vx) + y)
righty = int(((cols-x)*vy/vx)+y)
cv2.line(img,(cols-1,righty),(0,lefty),(0,255,0),2)

 

ثبت دیدگاه
نام *
ایمیل*
دیدگاه *
0دیدگاه