2012-01-29 15 views
11

ओपनसीवी के पायथन आवरण में कोई विधि/कार्य है जो बाइनरी छवि में काले क्षेत्रों को पाता है? (जैसे मैटलैब में regionprops) अब मैं अपने स्रोत छवि को लोड, सीमा के माध्यम से एक द्विआधारी छवि में बदलने और फिर इसे उलटने के काले क्षेत्रों (कि अब सफेद होते हैं) को उजागर करने के लिए।पायथन ओपनसीवी - बाइनरी छवि में काले क्षेत्रों को ढूंढें

मैं, सफेद क्षेत्रों के लिए काला हो cv.FindContours समारोह लागू करने के लिए द्विआधारी छवि inverting के बाद इस तरह के cvblobslob या cvblob

+1

कीवर्ड "क्षेत्रप्रॉप" के लिए +1 जो मुझे – Tarrasch

उत्तर

2

के रूप में तीसरे पक्ष के पुस्तकालयों का उपयोग नहीं कर सकते। यह आपको उस क्षेत्र की सीमाएं देगा जो आपको चाहिए।

बाद में आप cv.BoundingRect का उपयोग क्षेत्र के आसपास कम से कम सीमांकन आयत प्राप्त करने के लिए कर सकते हैं। एक बार जब आप आयत कोने मिला है, आप इसके केंद्र आदि

पा सकते हैं या क्षेत्र के केन्द्रक को खोजने के लिए, आकृति पाने के बाद cv.Moment समारोह का उपयोग करें। फिर x और y दिशा में cv.GetSpatialMoments का उपयोग करें। यह ओपनसीवी मैनुअल में समझाया गया है।

क्षेत्र खोजने के लिए, cv.ContourArea समारोह का उपयोग करें।

24

मूल रूप से, आप findContours समारोह संयोजन में कई अन्य कार्यों OpenCV विशेष रूप से इस उद्देश्य के लिए प्रदान करता है के साथ उपयोग करते हैं,।

उदाहरण कोड (मैं से सभी गुण मैटलैब का regionpropsWeightedCentroid और EulerNumber को छोड़कर है - आप बाहर EulerNumberfindContours में cv2.RETR_TREE का उपयोग कर और जिसके परिणामस्वरूप पदानुक्रम को देखकर काम कर सकता था , और मुझे यकीन है कि WeightedCentroid या तो मुश्किल नहीं होगा।

# grab contours 
cs,_ = cv2.findContours(BW.astype('uint8'), mode=cv2.RETR_LIST, 
          method=cv2.CHAIN_APPROX_SIMPLE) 
# set up the 'FilledImage' bit of regionprops. 
filledI = np.zeros(BW.shape[0:2]).astype('uint8') 
# set up the 'ConvexImage' bit of regionprops. 
convexI = np.zeros(BW.shape[0:2]).astype('uint8') 

# for each contour c in cs: 
# will demonstrate with cs[0] but you could use a loop. 
i=0 
c = cs[i] 

# calculate some things useful later: 
m = cv2.moments(c) 

# ** regionprops ** 
Area   = m['m00'] 
Perimeter  = cv2.arcLength(c,True) 
# bounding box: x,y,width,height 
BoundingBox = cv2.boundingRect(c) 
# centroid = m10/m00, m01/m00 (x,y) 
Centroid  = (m['m10']/m['m00'],m['m01']/m['m00']) 

# EquivDiameter: diameter of circle with same area as region 
EquivDiameter = np.sqrt(4*Area/np.pi) 
# Extent: ratio of area of region to area of bounding box 
Extent  = Area/(BoundingBox[2]*BoundingBox[3]) 

# FilledImage: draw the region on in white 
cv2.drawContours(filledI, cs, i, color=255, thickness=-1) 
# calculate indices of that region.. 
regionMask = (filledI==255) 
# FilledArea: number of pixels filled in FilledImage 
FilledArea = np.sum(regionMask) 
# PixelIdxList : indices of region. 
# (np.array of xvals, np.array of yvals) 
PixelIdxList = regionMask.nonzero() 

# CONVEX HULL stuff 
# convex hull vertices 
ConvexHull = cv2.convexHull(c) 
ConvexArea = cv2.contourArea(ConvexHull) 
# Solidity := Area/ConvexArea 
Solidity  = Area/ConvexArea 
# convexImage -- draw on convexI 
cv2.drawContours(convexI, [ConvexHull], -1, 
        color=255, thickness=-1) 

# ELLIPSE - determine best-fitting ellipse. 
centre,axes,angle = cv2.fitEllipse(c) 
MAJ = np.argmax(axes) # this is MAJor axis, 1 or 0 
MIN = 1-MAJ # 0 or 1, minor axis 
# Note: axes length is 2*radius in that dimension 
MajorAxisLength = axes[MAJ] 
MinorAxisLength = axes[MIN] 
Eccentricity = np.sqrt(1-(axes[MIN]/axes[MAJ])**2) 
Orientation  = angle 
EllipseCentre = centre # x,y 

# ** if an image is supplied with the BW: 
# Max/Min Intensity (only meaningful for a one-channel img..) 
MaxIntensity = np.max(img[regionMask]) 
MinIntensity = np.min(img[regionMask]) 
# Mean Intensity 
MeanIntensity = np.mean(img[regionMask],axis=0) 
# pixel values 
PixelValues = img[regionMask]   
+0

गुगलिंग के घंटों को बचाता है, इसे एक फ़ंक्शन में लपेटना और इसमें कुछ जानकारी (जैसे numpy recarray) को जानकारी के साथ वापस करना उपयोगी है। जबकि मैं इसमें हूं, मैं एक लेबल वाली छवि भी खींचता हूं जहां क्षेत्र 'i' में तीव्रता' i + 1' है (यह पृष्ठभूमि 0 के साथ विलय क्षेत्र से बचने के लिए है)। –

0

सीमा का उपयोग कर द्विआधारी छवि के लिए यह रूपांतरण CV_THRESH_BINARY_INV ध्वज के साथ, आप एक कदम में सीमा + उलट मिलता है।

0

आप एक और मुफ्त पुस्तकालय के उपयोग पर विचार कर सकते हैं, तो आप SciPy इस्तेमाल कर सकते हैं।

from scipy import ndimage 

def count_labels(self, mask_image): 
    """This function returns the count of labels in a mask image.""" 
    label_im, nb_labels = ndimage.label(mask_image) 
    return nb_labels 

यदि आवश्यक हो तो आप उपयोग कर सकते हैं:

import cv2 as opencv 

image = opencv.inRange(image, lower_threshold upper_threshold) 

एक मुखौटा छवि है, जो केवल काले और सफेद होता है, जहां सफेद में वस्तुओं रहे हैं पाने के लिए पहले यह गिनती क्षेत्रों में से एक बहुत ही सुविधाजनक तरीका है दी गई सीमा।

संबंधित मुद्दे