当前位置:首页|资讯|编程|ChatGPT

关于如何批量给训练集图像叠加掩码得到受损图像(傻子版教程)

作者:一煮竹发布时间:2024-03-25

本科毕设的方向是图像修复,但是本人是其实自动化专业的,opencv在此之前完全没有接触过,csdn代码太杂了,对于本若至来说理解困难,也尝试来B站找过教程但无奈没什么收获,从头开始学习时间成本太大。所以这是一篇结合了大量chatgpt回答的文章。

个人在整个过程中一直卡壳的地方是如何批量处理,赶进度太难了。

本教程可能存在大量冗余的步骤,可以提出但别笑我。

这是本文方法最终得到的图像结果,除去白色的掩码部分图像与原图一致。
尝试过不透明底处理掩码数据集,抄袭了很多代码,得到的是直接叠加了降低透明度的方法,效果很不理想,而且图像裁剪有问题。


首先你要下载两个数据集,一个是未受损的图像数据集,一个是掩码数据集。数据集相关内容百度可以搜到很多。

训练数据集,此处使用了巴黎街景数据集
这是掩码数据集

更改为透明底后的掩码数据集(不知道为什么还是有一圈黑边,可能我不小心处理出了伪影😒


  1. 将两个数据集进行批量重命名。代码参考:

    (此处生成的是用0填充五位数字,因为我的数据集图片数量是五位数

    import os
    path_name=r'你的数据集文件地址'
    count=os.listdir(path_name)

    for i in range(0,len(count)):#进入到文件夹内,对每个文件进行循环遍历
       j=0#表示图像名称从0开始
       k = str(i+j)
       other_url = k.zfill(5)#总共4位,除了数字部位,其余用0填充
       #os.path.join(path_name,item)表示找到每个文件的绝对路径并进行拼接操作
       os.rename(os.path.join(path_name,count[i]),os.path.join(path_name,(other_url+'.png')))
       j+=1

    print("Rename_Successed")


  2. 将两个数据集的图像进行批量改尺寸,尺寸需要一致

    此处尺寸是256×256,如果原图尺寸比例不同会被压缩成正方形。代码如下:

    import os
    import CV2
    from PIL import Image
    import os

    def resize_images(input_folder, output_folder):
       # 创建一个存放修改后图片的文件夹
       if not os.path.exists(output_folder):
           os.makedirs(output_folder)

       for filename in os.listdir(input_folder):
           if filename.endswith(".jpg") or filename.endswith(".png") or filename.endswith(".bmp") or filename.endswith(".gif"):
               img = Image.open(os.path.join(input_folder, filename)) # 打开输入文件夹中的图像文件

               # 以下两个功能选择使用
               # 简单粗暴直接调整图片大小为固定值
               new_size = (256, 256)  # 例如:(800, 600) 宽度为800,高度为600
               img_resized = img.resize(new_size) # 将图像大小调整为指定的大小
               img_resized.save(os.path.join(output_folder, filename)) # 将调整后的图像保存到输出文件夹中

    input_folder = r"你的数据集地址"
    output_folder = r"裁剪后保存的地址"

    # 执行函数resize_images,调整图片大小并保存到输出文件夹中
    resize_images(input_folder, output_folder)

  3. 如果你的掩码数据集的黑色部分不是透明底而是纯纯的黑色,那么在这一步可以将它转为透明底。代码如下:

    import os
    from PIL import Image

    # 设置要处理的文件夹路径
    input_folder = r'不透明的掩码数据集文件地址'
    output_folder = r'透明底掩码数据集文件地址'

    # 确保输出文件夹存在
    if not os.path.exists(output_folder):
       os.makedirs(output_folder)

    # 遍历输入文件夹中的所有文件
    for filename in os.listdir(input_folder):
       # 检查文件是否为 PNG 图像文件
       if filename.endswith('.png'):
           # 打开图像文件
           img_path = os.path.join(input_folder, filename)
           img = Image.open(img_path)

           # 获取图像的 RGBA 模式
           img = img.convert('RGBA')

           # 创建一个 data 列表,将黑色部分(RGB = (0, 0, 0))的 alpha 通道设为 0 (透明)
           data = []
           for pixel in img.getdata():
               if pixel[0] == 0 and pixel[1] == 0 and pixel[2] == 0:
                   data.append((0, 0, 0, 0))
               else:
                   data.append(pixel)

           # 更新图像的像素数据
           img.putdata(data)

           # 保存处理后的图像
           output_path = os.path.join(output_folder, filename)
           img.save(output_path)
           print(f'Processed {filename}')

  4. 然后就可以将两个数据集叠加啦,代码如下:

    import os
    from PIL import Image

    # 设置要处理的文件夹路径
    train_folder = '训练集文件夹'
    mask_folder = '透明底掩码文件夹'
    output_folder = '输出文件夹'

    # 确保输出文件夹存在
    if not os.path.exists(output_folder):
       os.makedirs(output_folder)

    # 遍历训练集文件夹中的所有文件
    for filename in os.listdir(train_folder):
       # 检查文件是否为 PNG 图像文件
       if filename.endswith('.png'):
           # 拼接掩码图像的文件名
           mask_filename = os.path.splitext(filename)[0] + '.png'
           mask_path = os.path.join(mask_folder, mask_filename)
           train_path = os.path.join(train_folder, filename)

           print(f"Train image path: {train_path}")
           print(f"Mask image path: {mask_path}")

           # 检查掩码文件是否存在
           if not os.path.exists(mask_path):
               print(f'Error: {mask_path} does not exist. Skipping {filename}.')
               continue

           # 打开训练集图像文件
           train_img = Image.open(train_path)

           # 获取训练集图像的尺寸
           width, height = train_img.size

           # 打开掩码图像文件
           mask_img = Image.open(mask_path)

           # 调整掩码图像的大小以匹配训练集图像
           mask_img = mask_img.resize((width, height), resample=Image.NEAREST)

           # 将掩码图像叠加在训练集图像上
           train_img.paste(mask_img, (0, 0), mask_img)

           # 保存处理后的图像
           output_path = os.path.join(output_folder, filename)
           train_img.save(output_path)
           print(f'Processed {filename}')

    之后就可以得到叠加的图像啦~终于迈出第一步



Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1