数据集处理实验4——标签可视化实验

写在前面

做数据集处理实验时突然意识到,越多的统计实验可能更适合比赛里,关于发现创新点的实验需要有针对性的实验才行。
还有就是怎么才能提升代码能力啊,有找别人的代码的时间,自己都能改了,呜呜呜呜。

三种可视化实验

简单有效的

实验代码


"""
目的:将原图片(img)与其xml(xml),合成为打标记的图片(labelled),矩形框标记用红色即可
已有:(1)原图片文件夹(imgs_path),(2)xml文件夹(xmls_path)
思路:
    step1: 读取(原图片文件夹中的)一张图片
    step2: 读取(xmls_path)该图片的xml文件,并获取其矩形框的两个对角顶点的位置
    step3: 依据矩形框顶点坐标,在该图片中画出该矩形框
    step4: 图片另存为'原文件名'+'_labelled',存在‘lablled’文件夹中
"""
import os
import cv2 as cv
import xml.etree.ElementTree as ET


def xml_jpg2labelled(imgs_path, xmls_path, labelled_path):
    imgs_list = os.listdir(imgs_path)
    xmls_list = os.listdir(xmls_path)
    nums = len(imgs_list)
    for i in range(nums):
        img_path = os.path.join(imgs_path, imgs_list[i])
        xml_path = os.path.join(xmls_path, xmls_list[i])
        img = cv.imread(img_path)
        labelled = img
        root = ET.parse(xml_path).getroot()
        objects = root.findall('object')
        for obj in objects:
            bbox = obj.find('bndbox')
            xmin = int(float(bbox.find('xmin').text.strip()))
            ymin = int(float(bbox.find('ymin').text.strip()))
            xmax = int(float(bbox.find('xmax').text.strip()))
            ymax = int(float(bbox.find('ymax').text.strip()))
            labelled = cv.rectangle(labelled, (xmin, ymin), (xmax, ymax), (0, 0, 255), 1)
        cv.imwrite('%s%s_labelled.jpg' % (labelled_path, imgs_list[i]), labelled)
        # cv.imshow('labelled', labelled)
        # cv.imshow('origin', origin)
        # cv.waitKey()


if __name__ == '__main__':
    imgs_path = 'G:\\pythonproject\\gt_visualization\\image'
    xmls_path = 'G:\\pythonproject\\gt_visualization\\box'
    labelled_path = 'G:\\pythonproject\\gt_visualization1\\replace'
    xml_jpg2labelled(imgs_path, xmls_path, labelled_path)


实验结果
请添加图片描述
标签清晰的用红框表示,但是不能完全区别类别


复杂到乱七八焦的

感谢大佬

实验程序

由于脑子不太清醒替换错了,导致修改后的代码不见了
但是印象里修改的部分很少
吃一堑长一智,我下次绝对做出来实验就及时记录一下

实验结果
生成了一些乱七八焦我还没看懂的东西
在这里插入图片描述
不过清楚的地展示了,含有未打标的图片
在这里插入图片描述
且不知道为什么还把小海胆、小海星、小扇贝、小海参给裁剪出来了
在这里插入图片描述
请添加图片描述
这个粗框标的也是十分的狂野了

鸡肋的第三种

到最后我也没有找到能将标签信息显示在图片上的程序,就是 用不同颜色区分不同类别,当然原罪还是自己的菜
实验代码

import os
import cv2 as cv
import xml.etree.ElementTree as ET

def xml_to_jpg(imgs_path, xmls_path, out_path):
    imgs_list = os.listdir(imgs_path)  #读取图片列表
    xmls_list = os.listdir(xmls_path)  # 读取xml列表
    if len(imgs_list) <= len(xmls_list):  #若图片个数小于或等于xml个数,从图片里面找与xml匹配的
        for imgName in imgs_list:
            temp1 = imgName.split('.')[0]   #图片名 例如123.jpg 分割之后 temp1 = 123
            temp1_ = imgName.split('.')[1]  #图片后缀
            if temp1_!='jpg' and temp1_ !='jpeg':
                continue
            for xmlName in xmls_list:       #遍历xml列表,
                temp2 = xmlName.split('.')[0]  #xml名
                temp2_ = xmlName.split('.')[1]
                if temp2_ != 'xml':
                    continue
                if temp2!=temp1:   #判断图片名与xml名是否相同,不同的话跳过下面的步骤 继续找
                    continue
                else:              #相同的话 开始读取xml坐标信息,并在对应的图片上画框
                    img_path = os.path.join(imgs_path, imgName)
                    xml_path = os.path.join(xmls_path, xmlName)
                    img = cv.imread(img_path)
                    labelled = img
                    root = ET.parse(xml_path).getroot()
                    for obj in root.iter('object'):
                        bbox = obj.find('bndbox')
                        xmin = int(bbox.find('xmin').text.strip())
                        ymin = int(bbox.find('ymin').text.strip())
                        xmax = int(bbox.find('xmax').text.strip())
                        ymax = int(bbox.find('ymax').text.strip())
                        labelled = cv.rectangle(labelled, (xmin, ymin), (xmax, ymax), (0, 0, 255), 2)
                    cv.imwrite(out_path + '\\' +imgName, labelled)
                    break
    else:  # 若xml个数小于图片个数,从xml里面找与图片匹配的。下面操作与上面差不多
        for xmlName in xmls_list:
            temp1 = xmlName.split('.')[0]
            temp1_ = xmlName.split('.')[1]
            if temp1_ != 'xml':
                continue
            for imgName in imgs_list:
                temp2 = imgName.split('.')[0]
                temp2_ = imgName.split('.')[1]  # 图片后缀
                if temp2_ != 'jpg' and temp2_ != 'jpeg':
                    continue
                if temp2 != temp1:
                    continue
                else:
                    img_path = os.path.join(imgs_path, imgName)
                    xml_path = os.path.join(xmls_path, xmlName)
                    img = cv.imread(img_path)
                    labelled = img
                    root = ET.parse(xml_path).getroot()

                    for obj in root.iter('object'):
                        bbox = obj.find('bndbox')
                        xmin = int(bbox.find('xmin').text.strip())
                        ymin = int(bbox.find('ymin').text.strip())
                        xmax = int(bbox.find('xmax').text.strip())
                        ymax = int(bbox.find('ymax').text.strip())
                        labelled = cv.rectangle(labelled, (xmin, ymin), (xmax, ymax), (0, 0, 255), 1)
                    cv.imwrite(out_path + '\\' +imgName, labelled)
                    break
if __name__ == '__main__':
	# 使用英文路径,中文路径读不进来
    imgs_path = r'G:\pythonproject\gt_visualization\image'  #图片路径
    xmls_path = r'G:\pythonproject\gt_visualization\box' #xml路径
    retangele_img_path = r'G:\pythonproject\gt_visualization2\new_data' #保存画框后图片的路径
    xml_to_jpg(imgs_path, xmls_path, retangele_img_path)


实验结果
这个的实验结果和第一种比较像,或许区别在于 红框更红了吧
请添加图片描述
请添加图片描述
请添加图片描述
总之,又是觉得很难发文章的一天

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值