python使用目标检测算法输出的box对图像目标进行抠图保存(附源码)


前言

在实际深度学习项目中,偶尔目标检测算法检测出的目标也会作为分类网络的输入数据,我们怎样利用目标检测算法的结果(如目标类别信息和box坐标信息)快速地对被检测图像进行抠图,以抠出来的图来扩充分类网络的数据,将是本文讲的主要内容。


提示:以下是本篇文章正文内容,代码程序可供参考

一、输出标签格式转换

以YOLOv5算法为例,打开–save-txt,目标检测结果则保存为txt标签文件(yolo格式),首先使用yolo转voc格式的脚本把txt文件批量转化为voc格式的标签,即xml文件。xml文件的内容如下图所示:包含目标类别信息和box的坐标信息,下面将以读取xml文件,来获取box坐标,进而对图像进行抠图。
xml格式标签

二、代码步骤分解

1.引入库

代码如下:

import cv2
import numpy as np
import xml.dom.minidom
import os
import argparse

2.修改图片、标签路径以及抠图保存路径

代码如下:

def main():
  # 将要被抠图的原始图片路径
  img_path = 'F:/Helmet_qi/work_clothes/work_clothes_img_ALL/' 
  # 转化后的XML文件的路径
  anno_path = 'F:/Helmet_qi/work_clothes/clothes_xml_ALL/'
  # 抠图保存的文件夹路径
  cut_path = 'F:/Helmet_qi/work_clothes/cut_img_0/'
  # 获取文件夹中的文件
  imagelist = os.listdir(img_path)

3.遍历文件夹中的图片

  for image in imagelist:
    image_pre, ext = os.path.splitext(image)
    img_file = img_path + image
    img = cv2.imread(img_file)
    xml_file = anno_path + image_pre + '.xml'
    DOMTree = xml.dom.minidom.parse(xml_file)
    collection = DOMTree.documentElement
    objects = collection.getElementsByTagName("object")

4.根据标签信息查找图片中的目标

读取xml文件中的目标类别与box的坐标信息

for object in objects:
      bndbox = object.getElementsByTagName('bndbox')[0]
      xmin = bndbox.getElementsByTagName('xmin')[0]
      xmin_data = xmin.childNodes[0].data
      ymin = bndbox.getElementsByTagName('ymin')[0]
      ymin_data = ymin.childNodes[0].data
      xmax = bndbox.getElementsByTagName('xmax')[0]
      xmax_data = xmax.childNodes[0].data
      ymax = bndbox.getElementsByTagName('ymax')[0]
      ymax_data = ymax.childNodes[0].data
      xmin = int(xmin_data)
      xmax = int(xmax_data)
      ymin = int(ymin_data)
      ymax = int(ymax_data)

5.使用cv对图像进行抠图保存

      img_cut = img[ymin:ymax, xmin:xmax, :]
      cv2.imwrite(cut_path + 'cut_img_{}.jpg'.format(image_pre), img_cut)

三、python完整程序

# -*- coding: utf-8 -*-
# @Time  : 2022/10/30 23:30
# @Author : yuguo
# @File  : cai_img_from_box.py
# @Software: PyCharm
import cv2
import numpy as np
import xml.dom.minidom
import os
import argparse

def main():
  # 将要被抠图的原始图片路径
  img_path = 'F:/Helmet_qi/work_clothes/work_clothes_img_ALL/' 
  # 转化后的XML文件的路径
  anno_path = 'F:/Helmet_qi/work_clothes/clothes_xml_ALL/'
  # 抠图保存的文件夹路径
  cut_path = 'F:/Helmet_qi/work_clothes/cut_img_0/'
  # 获取文件夹中的文件
  imagelist = os.listdir(img_path)

  imagelist = os.listdir(img_path)

  for image in imagelist:
    image_pre, ext = os.path.splitext(image)
    img_file = img_path + image
    img = cv2.imread(img_file)
    xml_file = anno_path + image_pre + '.xml'
    DOMTree = xml.dom.minidom.parse(xml_file)
    collection = DOMTree.documentElement
    objects = collection.getElementsByTagName("object")

    for object in objects:
      print("start")
      bndbox = object.getElementsByTagName('bndbox')[0]
      xmin = bndbox.getElementsByTagName('xmin')[0]
      xmin_data = xmin.childNodes[0].data
      ymin = bndbox.getElementsByTagName('ymin')[0]
      ymin_data = ymin.childNodes[0].data
      xmax = bndbox.getElementsByTagName('xmax')[0]
      xmax_data = xmax.childNodes[0].data
      ymax = bndbox.getElementsByTagName('ymax')[0]
      ymax_data = ymax.childNodes[0].data
      xmin = int(xmin_data)
      xmax = int(xmax_data)
      ymin = int(ymin_data)
      ymax = int(ymax_data)
      img_cut = img[ymin:ymax, xmin:xmax, :]
      cv2.imwrite(cut_path + 'cut_img_{}.jpg'.format(image_pre), img_cut)
      
if __name__ == '__main__':
  main()

总结

作者在做智慧工地项目时,甲方要求识别工人安全帽佩戴和工作服穿戴,其中安全帽佩戴使用的是目标检测算法,而工作服穿戴使用的是分类算法,数据集就是使用目标检测算法直接检测输出txt标签信息,然后按照本文步骤一步步操作,很快就得到大量分类数据集。不过需要字手动筛选下。本文见本使用起来方便快捷。
学好python,大大提高工作效率!觉得还不错的,感谢关注收藏,后续还会继续分享好用的数据处理脚本。

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
根据引用所述,Python作为一门高效的编程语言,其图像处理能力也非常强大。Python图像处理库具有高精度的边缘检测、自动裁剪等功能,可以准确地提取需要的物体。因此,Python抠图算法的实现方式可以分为以下几个步骤: 1.读取图像使用Python图像处理库PIL(Python Imaging Library)或OpenCV等库读取需要进行抠图图像。 2.预处理:对读取的图像进行预处理,包括图像增强、降噪、平滑等操作,以提高后续处理的准确性。 3.边缘检测:使用Python图像处理库进行边缘检测,以便更好地分离前景和背景。 4.分割图像:根据边缘检测的结果,将图像分割成前景和背景两部分。 5.抠图:根据分割出的前景部分,使用Python图像处理库进行抠图操作,将前景部分从原图中分离出来。 6.保存图像:将抠图后的结果保存为需要的格式,如PNG、JPEG等。 以下是一个使用OpenCV库实现的Python抠图算法的代码示例: ```python import cv2 # 读取图像 img = cv2.imread('image.jpg') # 预处理 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) blur = cv2.GaussianBlur(gray, (5, 5), 0) # 边缘检测 edges = cv2.Canny(blur, 50, 150) # 分割图像 contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) mask = cv2.drawContours(img, contours, -1, (0, 0, 255), 3) # 抠图 result = cv2.bitwise_and(img, mask) # 保存图像 cv2.imwrite('result.png', result) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客程序设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值