代码功能
目标检测可视化结果对比,使用场景是,将多张图片横向拼接起来(这里举例为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))