【问题标题】:How to get contours of multiple images in a folder如何获取文件夹中多个图像的轮廓
【发布时间】:2019-02-28 12:32:40
【问题描述】:

我在一个文件夹中有很多图像,我正在尝试检测文件夹中每个图像中的第二大轮廓以及该轮廓的面积和半径。这是我写的代码,但我只得到最后一张图像的半径。但是,当我打印出轮廓长度时,我会得到文件夹中每个图像的轮廓长度。有人可以建议如何获取文件夹中所有图像中检测到的轮廓的所有半径以及如何显示每张图像。

# looping and reading all images in the folder
for fn in glob.glob('E:\mf150414\*.tif'):
    im = cv2.imread(fn)
    blur = cv2.GaussianBlur(im,(5,5),cv2.BORDER_DEFAULT)
    img = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY) 
    ret, thresh = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    _, contours,_ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    second_largest_cnt = sorted(contours, key = cv2.contourArea, reverse = True)[1:2]
    cv2.drawContours(img,second_largest_cnt,-1,(255,255,255),-1)  

# detecting the area of the second largest contour
for i in second_largest_cnt:
    area = cv2.contourArea(i)*0.264583333    # Area of the detected contour (circle)                                                    
    equi_radius = np.sqrt(area/np.pi)        # radius of the contour

【问题讨论】:

    标签: python opencv image-processing


    【解决方案1】:

    您只能获得最后一张图片的半径,因为您在每个 for 循环中都重新分配了 second_largest_cnt。您需要在 for 循环之外创建一个 second_largest_cnt 数组来存储轮廓。例如:

    second_largest_cnts = []
    
    for fn in glob.glob('E:\mf150414\*.tif'):
        im = cv2.imread(fn)
        blur = cv2.GaussianBlur(im,(5,5),cv2.BORDER_DEFAULT)
        img = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY) 
        ret, thresh = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
        _, contours,_ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        second_largest_cnt = sorted(contours, key = cv2.contourArea, reverse = True)[1] # don't need slicing
        # store the contour
        second_largest_cnts.append(second_largest_cnt)
        cv2.drawContours(img,[second_largest_cnt],-1,(255,255,255),-1)  
    
    #do the same with radius
    radius = []
    # detecting the area of the second largest contour
    for i in second_largest_cnts:
        area = cv2.contourArea(i)*0.264583333    # Area of the detected contour (circle)                                                    
        radius.append(np.sqrt(area/np.pi))       # radius of the contour
    

    【讨论】:

      猜你喜欢
      • 2019-03-27
      • 2021-02-17
      • 1970-01-01
      • 2019-08-15
      • 2013-02-06
      • 2020-03-14
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      相关资源
      最近更新 更多