如何获取文件夹中多个图像的轮廓

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获取文件夹中多个图像的轮廓相关的知识,希望对你有一定的参考价值。

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

# 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
答案

您只获得最后一个图像的半径,因为您为每个循环重新分配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

以上是关于如何获取文件夹中多个图像的轮廓的主要内容,如果未能解决你的问题,请参考以下文章

如何解析 MPD 清单视频文件并获取图像适配集的片段?

Opencv和python获取文档正确的轮廓并在图像上绘制

使用 OpenCV 从轮廓中获取掩码

从图库中获取图像以在片段中的图像视图中设置? [复制]

如何使用 IMAGEMAGICK 转换获得图像的投影轮廓?

图像处理基于matlab图像主动轮廓实现与测试平台含Matlab源码 1381期