数据处理——根本表格信息重写图片名,检查图片名是否对应,二值图转换,输出二值图中目标个数等

1. 根据表格信息重命名图片名称

为了完成这个任务,我们需要编写一个Python脚本,读取 labels.xlsx 文件中的类别信息,并根据该信息将 imgsgts 文件夹中的图片重命名并保存到新的文件夹 new_imgsnew_gts 中。以下是实现此功能的Python脚本示例:

import os
import pandas as pd
import shutil

# 读取labels.xlsx文件
labels_df = pd.read_excel('labels.xlsx', dtype={'Image': str})

# 创建新文件夹
os.makedirs('new_imgs', exist_ok=True)
os.makedirs('new_gts', exist_ok=True)

# 遍历labels.xlsx中的每一行
for index, row in labels_df.iterrows():
    image_name = row['Image']
    image_type = row['Type']
    
    # 根据类别信息决定前缀
    prefix = '1' if image_type == 'Malignant' else '0'
    
    # 构建新的文件名
    new_filename = f"{prefix}_{image_name}.png"
    
    # 重命名并复制imgs中的图片
    old_img_path = os.path.join('imgs', f"{image_name}.png")
    new_img_path = os.path.join('new_imgs', new_filename)
    shutil.copyfile(old_img_path, new_img_path)
    
    # 重命名并复制gts中的图片
    old_gts_path = os.path.join('gts', f"{image_name}.png")
    new_gts_path = os.path.join('new_gts', new_filename)
    shutil.copyfile(old_gts_path, new_gts_path)

print("图片重命名并复制完成!")

代码说明:

  1. 读取Excel文件:使用 pandas 读取 labels.xlsx 文件,获取图片的名称及对应的类别信息。
  2. 创建新文件夹:使用 os.makedirs() 创建用于存放重命名后图片的文件夹 new_imgsnew_gts
  3. 遍历每一行数据:根据图片的类别信息决定前缀是 0 还是 1,然后构建新的文件名。
  4. 重命名并复制图片:使用 shutil.copyfile() 将原始图片复制到新的文件夹中,并使用新构建的文件名。

注意事项:

  • 确保 labels.xlsximgsgts 文件夹与脚本位于同一目录下。
  • 如果图片格式不是 png,请相应地修改脚本中的扩展名。



2. 判断两个文件夹中名称是否相同

要比较 imgs 文件夹和 gts 文件夹中的图片名称,找出不相同的部分,可以使用以下Python脚本:

import os

# 定义文件夹路径
imgs_folder = 'imgs'
gts_folder = 'gts'

# 获取两个文件夹中的文件名(去掉扩展名)
imgs_filenames = set(os.path.splitext(f)[0] for f in os.listdir(imgs_folder) if f.endswith('.png'))
gts_filenames = set(os.path.splitext(f)[0] for f in os.listdir(gts_folder) if f.endswith('.png'))

# 找出imgs中有但gts中没有的文件名
only_in_imgs = imgs_filenames - gts_filenames

# 找出gts中有但imgs中没有的文件名
only_in_gts = gts_filenames - imgs_filenames

# 输出不相同的文件名
if only_in_imgs:
    print("imgs文件夹中有但gts文件夹中没有的图片名:")
    for name in only_in_imgs:
        print(name)

if only_in_gts:
    print("gts文件夹中有但imgs文件夹中没有的图片名:")
    for name in only_in_gts:
        print(name)

if not only_in_imgs and not only_in_gts:
    print("所有文件名在两个文件夹中都相同。")

代码说明:

  1. 获取文件名:使用 os.listdir() 获取 imgsgts 文件夹中的文件名,并使用 os.path.splitext() 去除扩展名,只保留文件名。
  2. 转换为集合:将文件名转换为集合,以便轻松比较两个集合的差异。
  3. 找出差异:使用集合的差集操作 imgs_filenames - gts_filenamesgts_filenames - imgs_filenames 来找出只在 imgsgts 文件夹中存在的文件名。
  4. 输出结果:如果存在不匹配的文件名,它们将被输出。如果两个文件夹中的文件名完全相同,则输出提示信息。

运行结果:

  • 如果两个文件夹中有不匹配的文件名,将分别输出这些文件名。
  • 如果所有文件名都相同,则会提示“所有文件名在两个文件夹中都相同。”

这个脚本能帮助你轻松地找出 imgsgts 文件夹中不匹配的文件名。



3. 按照要求重命名图片名称

为了完成将 gts 文件夹中所有图片的名称的后5个字符删除的任务,可以使用以下Python脚本:

import os

# 定义gts文件夹的路径
gts_folder = 'gts'

# 遍历gts文件夹中的所有文件
for filename in os.listdir(gts_folder):
    if filename.endswith('.png'):
        # 去除文件名的后5个字符并保留扩展名
        new_name = filename[:-9] + ".png"  # 假设图片的扩展名为'.png' 后五个+后缀名共9个字符,因此是-9
        
        # 定义旧文件路径和新文件路径
        old_path = os.path.join(gts_folder, filename)
        new_path = os.path.join(gts_folder, new_name)
        
        # 重命名文件
        os.rename(old_path, new_path)

print("文件重命名完成!")

代码说明:

  1. 遍历文件夹:使用 os.listdir() 获取 gts 文件夹中的所有文件。
  2. 检查文件扩展名:使用 if filename.endswith('.png') 来确保只对 .png 文件进行处理。
  3. 删除后5个字符:使用字符串切片 filename[:-9] 删除文件名的后5个字符(减9是因为需要减去5个字符的文件名部分以及 .png 的4个字符扩展名)。
  4. 重命名文件:使用 os.rename() 函数将文件重命名。

注意事项:

  • 确保所有文件的扩展名相同。如果使用的图片格式不是 .png,请相应调整代码中的扩展名处理部分。
  • 此代码会直接修改文件名,请确认需要删除的字符确实是文件名的后5个字符。

这个脚本会删除文件名末尾的5个字符,并保留扩展名,完成后 gts 文件夹中的文件将会被重命名。



4. 根据图片名称重命名图片

要对 imgs 文件夹中的图片进行重命名,并将重命名后的图片保存在 new_imgsnew_gts 文件夹中,可以使用以下Python脚本:

import os
import shutil

# 定义文件夹路径
imgs_folder = 'imgs'
gts_folder = 'gts'
new_imgs_folder = 'new_imgs'
new_gts_folder = 'new_gts'

# 创建新文件夹
os.makedirs(new_imgs_folder, exist_ok=True)
os.makedirs(new_gts_folder, exist_ok=True)

# 定义一个函数用于重命名和复制文件
def rename_and_copy(old_folder, new_folder, prefix, filename):
    # 构建新的文件名
    new_filename = f"{prefix}_{filename}"
    
    # 定义旧文件路径和新文件路径
    old_path = os.path.join(old_folder, filename)
    new_path = os.path.join(new_folder, new_filename)
    
    # 复制文件到新文件夹并重命名
    shutil.copyfile(old_path, new_path)

# 遍历imgs文件夹中的所有文件
for filename in os.listdir(imgs_folder):
    if filename.endswith('.png'):
        # 获取文件名的第一个字母
        first_letter = filename[0].lower()  # 将字母转换为小写以防止大小写不一致问题
        
        # 根据第一个字母决定前缀
        if first_letter == 'b':
            prefix = '0'
        elif first_letter == 'm':
            prefix = '1'
        else:
            continue  # 跳过不符合条件的文件
        
        # 在imgs和gts文件夹中进行重命名和复制
        rename_and_copy(imgs_folder, new_imgs_folder, prefix, filename)
        rename_and_copy(gts_folder, new_gts_folder, prefix, filename)

print("图片重命名并复制完成!")

代码说明:

  1. 定义文件夹路径:设置 imgsgtsnew_imgsnew_gts 文件夹的路径。
  2. 创建新文件夹:使用 os.makedirs() 函数创建存放重命名后图片的新文件夹 new_imgsnew_gts,如果文件夹已经存在,则不会报错。
  3. 定义重命名和复制的函数:函数 rename_and_copy() 接受旧文件夹路径、新文件夹路径、前缀、和文件名作为参数,将文件重命名并复制到新文件夹中。
  4. 遍历 imgs 文件夹:遍历 imgs 文件夹中的所有 .png 文件,检查文件名的第一个字母。
    • 如果第一个字母是 b,则前缀为 0
    • 如果第一个字母是 m,则前缀为 1
    • 其他情况下,文件将被跳过。
  5. 重命名并复制:调用 rename_and_copy() 函数对 imgsgts 文件夹中的图片进行重命名并复制到相应的新文件夹中。

运行结果:

  • new_imgsnew_gts 文件夹中,图片会根据第一个字母被重命名为 0_X.png1_X.png,并保存。

这个脚本可以轻松地对图片进行重命名并分类存放在新的文件夹中。



5. 将图片转换成二值图并改变后缀名

要将 gts 文件夹中的所有 .bmp 文件转换为 .png 格式,并将图像二值化为 0 和 255,您可以使用以下 Python 脚本。该脚本将使用 PIL 库来处理图像转换和二值化。

import os
from PIL import Image

# 定义gts文件夹路径
gts_folder = 'gts'
new_gts_folder = 'new_gts'

# 创建新文件夹
os.makedirs(new_gts_folder, exist_ok=True)

# 遍历gts文件夹中的所有bmp文件
for filename in os.listdir(gts_folder):
    if filename.endswith('.bmp'):
        # 打开bmp图像
        img_path = os.path.join(gts_folder, filename)
        img = Image.open(img_path)

        # 将图像转换为灰度模式
        img = img.convert('L')

        # 将图像二值化为0和255
        threshold = 128
        img = img.point(lambda p: 255 if p > threshold else 0)

        # 构建新的文件名,将后缀从bmp改为png
        new_filename = os.path.splitext(filename)[0] + '.png'
        new_img_path = os.path.join(new_gts_folder, new_filename)

        # 保存为png格式
        img.save(new_img_path)

print("图片转换和二值化完成!")

代码说明:

  1. 导入必要的库PIL 库用于图像处理,其中 Image 模块可以打开、修改并保存图像。
  2. 定义文件夹路径:指定原始 gts 文件夹和保存新图像的 new_gts 文件夹路径。
  3. 创建新文件夹os.makedirs() 创建 new_gts 文件夹来保存二值化后的 PNG 图像。
  4. 遍历 gts 文件夹中的 BMP 文件:使用 os.listdir() 获取文件夹中的所有文件,并通过 filename.endswith('.bmp') 确保只处理 BMP 文件。
  5. 图像转换
    • 打开 BMP 文件并转换为灰度模式 ('L')。
    • 使用 point 方法将图像二值化为 0 和 255。选择阈值 128,像素值大于该阈值的部分将设为 255,小于等于该阈值的部分设为 0。
  6. 保存为 PNG 格式:将文件名后缀从 .bmp 改为 .png,然后保存图像。

运行结果:

  • 所有 .bmp 文件将被转换为二值化的 .png 图像,并保存在 new_gts 文件夹中。

这段代码将确保图像在转换过程中只包含 0 和 255 这两种像素值,从而生成二值图像。



6. 统计二值图中目标的个数并输出符号条件的图片名称

要计算每张二值图像中的目标数量,并输出目标数量大于 2 的图片名称,可以使用以下 Python 脚本。此脚本使用 OpenCV 来识别和计数图像中的目标。

import os
import cv2

# 定义二值图像文件夹路径
new_gts_folder = 'new_gts'

# 遍历new_gts文件夹中的所有png文件
for filename in os.listdir(new_gts_folder):
    if filename.endswith('.png'):
        # 读取二值图像
        img_path = os.path.join(new_gts_folder, filename)
        img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)

        # 查找图像中的所有目标(连通区域)
        num_labels, labels_im = cv2.connectedComponents(img)

        # num_labels包含背景,因此目标数量为num_labels - 1
        num_targets = num_labels - 1

        # 如果目标数量大于2,则输出图片名称
        if num_targets > 2:
            print(f"{filename}: {num_targets} 个目标")

代码说明:

  1. 导入必要的库
    • cv2OpenCV 的 Python 接口,用于图像处理和目标检测。
  2. 定义文件夹路径:指定包含二值化 PNG 图像的文件夹路径。
  3. 遍历 PNG 文件:使用 os.listdir() 获取文件夹中的所有文件,并通过 filename.endswith('.png') 确保只处理 PNG 文件。
  4. 读取图像:使用 cv2.imread() 读取每张二值化图像,并以灰度模式加载。
  5. 查找图像中的目标
    • 使用 cv2.connectedComponents() 方法识别图像中的连通区域(即目标)。
    • num_labels 返回的值包括背景区域,因此实际的目标数量是 num_labels - 1
  6. 输出目标数量大于2的图片名称:如果检测到的目标数量大于 2,则输出图像的文件名和目标数量。

运行结果:

  • 该脚本将输出所有目标数量大于 2 的图片名称及其目标数量。

这个脚本可以帮助你识别和过滤出那些包含多个目标的二值图像,从而进一步分析或处理。



7. 将JSON数据写到表格中

要将给定的 JSON 文件内容写入到新的 labels.xlsx 表格中,并将 JSON 中的 Key 写入 Image 列,Value 写入 Type 列,可以使用以下 Python 脚本:

import json
import pandas as pd

# 定义JSON文件路径
json_file_path = 'data.json'

# 读取JSON文件
with open(json_file_path, 'r') as file:
    data = json.load(file)

# 将JSON数据转换为DataFrame
df = pd.DataFrame(list(data.items()), columns=['Image', 'Type'])

# 保存为Excel文件
output_file_path = 'labels.xlsx'
df.to_excel(output_file_path, index=False)

print(f"数据已成功写入 {output_file_path}")

代码说明:

  1. 导入必要的库
    • json 用于读取 JSON 文件。
    • pandas 用于将数据写入 Excel 文件。
  2. 读取 JSON 文件:使用 json.load() 方法读取 JSON 文件,并将其加载为 Python 字典。
  3. 转换为 DataFrame
    • 使用 pandas.DataFrame() 方法将字典转换为 DataFrame。
    • list(data.items()) 将字典转换为一个列表,其中每个元素是一个 (Key, Value) 对。
    • columns=['Image', 'Type'] 指定 DataFrame 的列名。
  4. 保存为 Excel 文件:使用 df.to_excel() 方法将 DataFrame 保存为 Excel 文件,并设置 index=False 以避免保存索引列。
  5. 输出文件路径output_file_path 定义了生成的 Excel 文件的路径。

运行结果:

  • 生成一个名为 labels.xlsx 的 Excel 文件,其中:
    • Image 列对应 JSON 中的 Key
    • Type 列对应 JSON 中的 Value

这个脚本可以轻松地将 JSON 数据转换为 Excel 格式,适用于各种类似的结构化数据处理需求。



8. 重命名data下的各个数据集中的图片名

要将 data11 文件夹下的每个图片名称后加上所在数据集的名称,可以使用以下 Python 脚本。该脚本会遍历每个数据集子文件夹,并对其中的 new_imgsnew_gts 文件夹中的图片进行重命名。

import os

# 定义data11文件夹路径
data11_folder = 'data11'

# 遍历data11文件夹下的每个数据集子文件夹
for dataset_name in os.listdir(data11_folder):
    dataset_path = os.path.join(data11_folder, dataset_name)

    # 确保当前项是一个文件夹
    if os.path.isdir(dataset_path):
        # 定义new_imgs和new_gts文件夹路径
        new_imgs_folder = os.path.join(dataset_path, 'new_imgs')
        new_gts_folder = os.path.join(dataset_path, 'new_gts')

        # 检查并遍历new_imgs文件夹中的所有图片文件
        if os.path.exists(new_imgs_folder):
            for filename in os.listdir(new_imgs_folder):
                old_img_path = os.path.join(new_imgs_folder, filename)
                # 构建新的文件名
                new_filename = os.path.splitext(filename)[0] + f'_{dataset_name}' + os.path.splitext(filename)[1]
                new_img_path = os.path.join(new_imgs_folder, new_filename)
                # 重命名文件
                os.rename(old_img_path, new_img_path)

        # 检查并遍历new_gts文件夹中的所有图片文件
        if os.path.exists(new_gts_folder):
            for filename in os.listdir(new_gts_folder):
                old_gts_path = os.path.join(new_gts_folder, filename)
                # 构建新的文件名
                new_filename = os.path.splitext(filename)[0] + f'_{dataset_name}' + os.path.splitext(filename)[1]
                new_gts_path = os.path.join(new_gts_folder, new_filename)
                # 重命名文件
                os.rename(old_gts_path, new_gts_path)

print("图片重命名完成!")

代码说明:

  1. 定义文件夹路径:指定 data11 文件夹的路径。
  2. 遍历每个数据集子文件夹
    • 使用 os.listdir() 获取 data11 文件夹下的所有子文件夹(即数据集名称)。
    • 检查每个项是否是文件夹,确保不处理非文件夹项。
  3. 遍历 new_imgsnew_gts 文件夹中的图片
    • new_imgsnew_gts 文件夹中的每个图片文件进行重命名。
    • 使用 os.path.splitext() 分离文件名和扩展名。
    • 将数据集名称作为后缀添加到文件名中,并保留原有扩展名。
  4. 重命名文件:使用 os.rename() 将文件重命名。

运行结果:

  • data11 文件夹下的每个图片文件将根据其所属的数据集添加后缀。例如,image1.png 变为 image1_datasetName.png

这个脚本适用于批量处理和重命名大量图片文件,确保每个图片文件名中包含其来源数据集的信息。

  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Philo`

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

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

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

打赏作者

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

抵扣说明:

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

余额充值