目标检测可视化结果对比--图片拼接

代码功能

目标检测可视化结果对比,使用场景是,将多张图片横向拼接起来(这里举例为3张图片拼接),对比不同模型的检测效果:

  • test_images 文件夹里面是输入图片,比如1.jpg,2.jpg,3.jpg,4.jpg,5.jpg
  • test_out01 文件夹里面是通过模型1的检测结果图片,比如1.jpg,2.jpg,3.jpg,4.jpg(有可能没有检测到,所以有些图片不会输出可视化的结果,test_out01里面的图片数量少于test_images)
  • test_out02 文件夹里面是通过模型2的检测结果图片,比如2.jpg,3.jpg,4.jpg,5.jpg(有可能没有检测到,所以有些图片不会输出可视化的结果,test_out01里面的图片数量少于test_images)
    在这里插入图片描述
    拼接效果示例:依次为 test_out01、test_out02、label
    在这里插入图片描述

代码使用方法

  • 把以下路径修改为自己的
    在这里插入图片描述
  • 可以通过修改 COL 和 ROW 的值,控制拼接方向(如下图这样设置,效果就是竖向拼接了)
    在这里插入图片描述

代码实现思路

  • 首先判断 保存拼接图片的文件夹OUT_NAME 是否存在,如果文件夹已经存在,则程序退出,请把已有文件夹删掉
  • 遍历label中的每一个图片,得到图片名字,与另外两个文件夹进行路径拼接,得到三张图片的“路径+名字”,送入concat_images()函数进行拼接(test_images、test_out01、test_out02、label中的图片名字是对应一致的,由于label中的图片最全,所以以label中的图片为主线进行遍历)
  • concat_images()函数的实现思路,见代码注解即可

代码

'''
把多张图片拼接起来,此脚本是3个图片横向拼接的示例
'''

import os
from traceback import print_tb
from PIL import Image
from random import sample, choices


# 超参数
test_images = "test22/images_24"            # 测试图片所在文件夹

test_out01 = "yolox_select/v0_x/test_out"   # 模型1图片所在文件夹
test_out02 = "yolox_select/v3_x/test_out"   # 模型2图片所在文件夹
lable_path='test22/xml_one_class_visual'    # label图片所在文件夹

OUT_NAME = "yolox_select/compare2" #拼接出的图片保存的文件夹

# 设置横向拼接,如果需要多个图片拼接,可以在此设置
PATH_list = [test_out01, test_out02, lable_path]
COL = 3 #指定拼接图片的列数,就是PATH_list的列数
ROW = 1 #指定拼接图片的行数,就是PATH_list的行数

SAVE_QUALITY = 100 #保存的图片的质量 可选0-100



def is_image_file(filename):
    return any(filename.endswith(extension) for extension in ['.png', '.jpg', '.jpeg', '.PNG', '.JPG', '.JPEG'])
    

#进行图片的复制拼接
def concat_images(image_names, out_name, ori_img):
    '''
    image_names:是待拼接图片的路径['test_out01/002592.jpg', 'test_out02/002592.jpg', 'lable_path/002592.jpg']
    out_name:拼接完成图片的路径+名字
    ori_img:'test_images/002592.jpg',用于填补test_out01和test_out02中图片不存在的情况
    '''
    image_files = []

    for index in range(COL*ROW):              
        # print("index = ", index)
        current_img = image_names[index]
        if os.path.exists(current_img):
            img = Image.open(current_img)
            UNIT_WIDTH_SIZE = img.width        #读取单张图片的宽
            UNIT_HEIGHT_SIZE = img.height      #读取单张图片的高
            image_files.append(img) #读取所有用于拼接的图片
        else:
            im2 = Image.open(ori_img) # 如果 test_out01 和 test_out02 不存在该图片,则使用原始的 test_images 填充
            image_files.append(im2)

    target = Image.new('RGB', (UNIT_WIDTH_SIZE * COL, UNIT_HEIGHT_SIZE * ROW)) #创建成品图的画布
    #第一个参数RGB表示创建RGB彩色图,第二个参数传入元组指定图片大小,第三个参数可指定颜色,默认为黑色
    for row in range(ROW):
        for col in range(COL):
            #对图片进行逐行拼接
            #paste方法第一个参数指定需要拼接的图片,第二个参数为二元元组(指定复制位置的左上角坐标)
            #或四元元组(指定复制位置的左上角和右下角坐标)
            target.paste(image_files[COL*row+col], (0 + UNIT_WIDTH_SIZE*col, 0 + UNIT_HEIGHT_SIZE*row))
    target.save(out_name, quality=SAVE_QUALITY) #成品图保存

if __name__ == '__main__':

    # 创建保存拼接图片的文件夹
    if not os.path.exists(OUT_NAME):
        os.makedirs(OUT_NAME)
    else:
        print("文件夹 %s 已存在,程序已退出,请处理..."%(OUT_NAME))
        exit(0)

    # 遍历 label 中的每一张图片,对一张进行拼接
    image_filenames = [x for x in os.listdir(lable_path) if is_image_file(x)]
    for image_filename in image_filenames:
        # 准备好要拼接的三张图片的 "绝对路径+图片名"
        image_names = []
        for img_path in PATH_list:
            image_names.append(os.path.join(img_path, image_filename))
        print("image_names = ", image_names)

        # 拼接图片
        concat_images(image_names, 
                      os.path.join(OUT_NAME, image_filename), 
                      os.path.join(test_images, image_filename))
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值