基于opencv计算轮廓面积和周长

张开发
2026/4/20 22:41:23 15 分钟阅读

分享文章

基于opencv计算轮廓面积和周长
文章目录代码注释与总结阐述代码注释总结阐述代码注释与总结阐述代码注释importxlwt# 导入用于操作Excel文件的库importcv2# 导入OpenCV库用于图像处理importos# 导入操作系统相关库用于文件和目录操作importnumpyasnp# 导入NumPy库用于数值计算defcount(path): 计算图像中物体的周长和面积。 参数: path (str): 包含图像的文件夹路径。 返回: tuple: 包含三个列表的元组分别是图像文件名、每个图像对应的周长列表、每个图像对应的面积列表。 image_name[]# 存放文件名的列表perimeter[]# 存放周长的列表area[]# 存放面积的列表# 遍历指定路径下的所有文件foridinos.listdir(path):print(id)# 打印当前处理的文件名image_name.append(id)# 将文件名添加到列表中image_pathos.path.join(path,id)# 构建完整的图像路径imagecv2.imread(image_path)# 读取图像文件# 转换为灰度图像img_graycv2.cvtColor(image,cv2.COLOR_BGR2GRAY)# 使用阈值处理将图像二值化黑白ret,img_bincv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)# 创建一个形态学核函数用于后续的形态学操作kernelcv2.getStructuringElement(cv2.MORPH_RECT,(15,15))# 对二值图像进行开运算先腐蚀后膨胀去除噪声binarycv2.morphologyEx(img_bin,cv2.MORPH_OPEN,kernel)# 查找轮廓contours,hierarchycv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)# 按照面积从大到小排序轮廓并选择面积第二大的轮廓假设最大轮廓可能是背景或边界contourssorted(contours,keycv2.contourArea,reverseTrue)iflen(contours)1:ccv2.arcLength(contours[1],True)# 计算选定轮廓的周长scv2.contourArea(contours[1])# 计算选定轮廓的面积print(周长,c)print(面积,s)print(-*30)# 在原始图像上绘制所有轮廓imgnewcv2.drawContours(image,contours,-1,(0,255,255),3)perimeter.append(c)# 将周长添加到列表中area.append(s)# 将面积添加到列表中else:print(未找到足够的轮廓)returnimage_name,perimeter,areadefwrite_excel(save_excel_path,image_name,perimeter,area): 将图片名称、周长、面积写入Excel文件中。 参数: save_excel_path (str): Excel文件保存路径。 image_name (list): 图像文件名列表。 perimeter (list): 周长列表。 area (list): 面积列表。 # 如果目标路径下已经存在同名Excel文件则删除它ifos.path.isfile(save_excel_path):os.remove(save_excel_path)print(已经删除表格{}.format(save_excel_path))indexlen(image_name)# 获取需要写入数据的行数workbookxlwt.Workbook()# 新建一个工作簿对象sheet_namecountsheetworkbook.add_sheet(sheet_name,cell_overwrite_okTrue)# 添加一个新的工作表# 写入表头信息sheet.write(0,0,图片名)sheet.write(0,1,周长)sheet.write(0,2,面积)# 写入每一行的数据foriinrange(0,index):sheet.write(i1,0,image_name[i])sheet.write(i1,1,perimeter[i])sheet.write(i1,2,area[i])workbook.save(save_excel_path)# 保存工作簿print(xls格式表格写入数据成功)if__name____main__:path./images# 图片存放的文件夹路径save_excel_path./计算表.xls# Excel文件保存路径# 调用函数计算每张图片的周长和面积并获取结果image_name,perimeter,areacount(path)# 将计算得到的结果写入到Excel文件中write_excel(save_excel_path,image_name,perimeter,area)总结阐述该Python脚本的主要目的是批量处理给定文件夹内的所有图像文件计算每个图像中目标物体的周长和面积并将这些信息记录在一个Excel文件中。具体来说它实现了以下几个功能图像处理读取指定路径下的所有图像文件。将彩色图像转换为灰度图像。使用二值化方法将图像中的目标区域与其他部分区分开来。应用形态学操作如开运算来清理噪声并增强目标区域。使用OpenCV库查找图像中的轮廓并根据面积大小对轮廓进行排序选择面积较大的轮廓作为目标物体。特征提取对于每个图像计算目标物体的周长和面积。这些计算是基于OpenCV提供的arcLength和contourArea函数完成的。数据记录将每个图像的文件名、计算出的周长和面积存储在列表中。最终将这些数据以结构化的方式写入一个Excel文件方便用户查看和进一步分析。自动化流程整个过程是自动化的用户只需提供包含图像的文件夹路径以及希望保存结果的Excel文件路径即可。脚本会遍历文件夹中的每一个图像文件依次进行上述处理步骤并最终生成一份详细的报告。此脚本非常适合用于需要快速评估大量图像中特定目标尺寸的应用场景例如质量控制、医学影像分析等。通过使用OpenCV进行图像处理确保了高效准确地提取目标特征而利用xlwt库创建Excel文件则提供了易于阅读和分享的结果输出方式。此外代码中包含了详细的注释使得其他开发者能够轻松理解其工作原理并根据实际需求对其进行修改或扩展。

更多文章