پردازش تصویر در OpenCV
خواص کانتور (Contour Properties)
در اینجا یاد میگیریم چگونه برخی خواص پرکاربرد اشیاء مانند Solidity، قطر معادل (Equivalent Diameter)، تصویر ماسک (Mask image)، شدت میانگین (Mean Intensity) و غیره را استخراج کنیم. ویژگیهای بیشتر را میتوان در مستندات Matlab regionprops یافت.
(توجه: مرکز جرم، مساحت، محیط و غیره نیز به این دسته تعلق دارند، اما آنها را در فصل قبل بررسی کردیم)
۱. نسبت ابعاد (Aspect Ratio)#
این نسبت عرض به ارتفاع مستطیل محاط شیء است.
x,y,w,h = cv.boundingRect(cnt)
aspect_ratio = float(w)/h
۲. وسعت (Extent)#
Extent نسبت مساحت کانتور به مساحت مستطیل محاط است.
area = cv.contourArea(cnt)
x,y,w,h = cv.boundingRect(cnt)
rect_area = w*h
extent = float(area)/rect_area
۳. جامدیت (Solidity)#
Solidity نسبت مساحت کانتور به مساحت پوش محدب (Convex Hull) آن است.
area = cv.contourArea(cnt)
hull = cv.convexHull(cnt)
hull_area = cv.contourArea(hull)
solidity = float(area)/hull_area
۴. قطر معادل (Equivalent Diameter)#
قطر معادل (Equivalent Diameter) قطر دایرهای است که مساحت آن برابر با مساحت کانتور است.
area = cv.contourArea(cnt)
equi_diameter = np.sqrt(4*area/np.pi)
۵. جهتیابی (Orientation)#
جهتیابی (Orientation) زاویهای است که شیء به آن سمت قرار گرفته است. روش زیر همچنین طول محور اصلی (Major Axis) و محور فرعی (Minor Axis) را نیز برمیگرداند.
(x,y),(MA,ma),angle = cv.fitEllipse(cnt)
۶. ماسک و نقاط پیکسل (Mask and Pixel Points)#
در برخی موارد، ممکن است به تمام نقاطی که شیء را تشکیل میدهند نیاز داشته باشیم. این کار را میتوان به صورت زیر انجام داد:
mask = np.zeros(imgray.shape,np.uint8)
cv.drawContours(mask,[cnt],0,255,-1)
pixelpoints = np.transpose(np.nonzero(mask))
#pixelpoints = cv.findNonZero(mask)
در اینجا، دو روش ارائه شدهاند؛ یکی با استفاده از توابع Numpy و دیگری با استفاده از تابع OpenCV (آخرین خط کامنت شده) که هر دو کار یکسانی انجام میدهند. نتایج نیز یکسان هستند، اما با یک تفاوت جزئی. Numpy مختصات را به فرمت (ردیف، ستون) ارائه میدهد، در حالی که OpenCV مختصات را به فرمت (x,y) ارائه میدهد. بنابراین در اصل، جوابها معکوس خواهند بود. توجه داشته باشید که row = y و column = x.
۷. مقدار بیشینه، مقدار کمینه و مکان آنها#
میتوانیم این پارامترها را با استفاده از یک تصویر ماسک پیدا کنیم.
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(imgray,mask = mask)
۸. رنگ میانگین یا شدت میانگین (Mean Color or Mean Intensity)#
در اینجا، میتوانیم رنگ میانگین یک شیء را پیدا کنیم. یا میتواند شدت میانگین شیء در حالت مقیاس خاکستری باشد. دوباره از همان ماسک برای انجام این کار استفاده میکنیم.
mean_val = cv.mean(im,mask = mask)
۹. نقاط حدی (Extreme Points)#
نقاط حدی (Extreme Points) به معنای بالاترین، پایینترین، راستترین و چپترین نقاط شیء است.
leftmost = tuple(cnt[cnt[:,:,0].argmin()][0])
rightmost = tuple(cnt[cnt[:,:,0].argmax()][0])
topmost = tuple(cnt[cnt[:,:,1].argmin()][0])
bottommost = tuple(cnt[cnt[:,:,1].argmax()][0])
برای مثال، اگر آن را برای نقشه هند اعمال کنم، نتیجه زیر را به دست میآورم:

تمرینها#
- هنوز برخی ویژگیها در مستندات Matlab regionprops باقی ماندهاند. سعی کنید آنها را پیادهسازی کنید.