变化检测数据集制作详细版

news2024/9/24 15:29:15

本文记录在进行变化检测数据集制作过程中所使用的代码

首先需要准备相同地区不同时间的两幅影像,裁减成合适大小,如256*256。相同区域命名相同放在两个文件夹下。

接着使用labelme对变化区域进行标注,这里不再进行labelme安装及标注的赘述。

在标注完成后,会在A、B两个文件夹下生成对应的json文件,A文件夹的json文件为对影像A的标注,B同上。

代码块包含四个部分:

1.json to png

2.同名png合并(处理AB都发生变化的标签)

3.独有png提取(处理只在A或B发生变化的标签)

4.png对应jpg提取(根据生成的标签检索AB)

1、将A的json文件放在Ajson文件夹,B同上,进行json转png

# json转png   开发时间:2023/5/13 21:19

#------------------------------------------------------#
# 文件夹A\B所有影像
# 文件夹Ajson\Bjson所有json文件
#------------------------------------------------------#

import json
import os
import numpy as np
import cv2


def json_to_png(json_file_path, png_file_path):
    with open(json_file_path, 'r') as f:
        data = json.load(f)
    # 将json文件中的标注信息读取出来
    shapes = data['shapes']
    label_names = [shape['label'] for shape in shapes]
    # 获取每个标签对应的颜色值
    distinct_label_names = list(set(label_names))
    # 标签对应色彩字典
    label_name_to_color = {'1': (255, 255, 255)}
    # 创建空白的图片,并将每个像素点的值初始化为0
    img_height = data['imageHeight']
    img_width = data['imageWidth']
    img = np.zeros((img_height, img_width), dtype=np.uint8)
    # 为每个标注区域填充对应的颜色
    for shape in shapes:
        label_name = shape['label']
        color = label_name_to_color[label_name]
        points = shape['points']
        pts = np.array(points, np.int32)
        cv2.fillPoly(img, [pts], color=color)
    # 将生成的png图片保存到文件
    cv2.imwrite(png_file_path, img)


if __name__ == '__main__':

    json_file_path = 'Ajson'
    json_fileList = os.listdir(json_file_path)
    for json_file in json_fileList:
        a = json_file
        file_path_name = json_file_path + '/' + json_file
        # 截取文件名,用来命名图片
        name = os.path.splitext(file_path_name)[0]
        index = name + '.png'
        json_to_png(file_path_name, index)
        print(file_path_name, 'to', index)

    json_file_path_b = 'Bjson'
    json_fileList = os.listdir(json_file_path_b)
    for json_file in json_fileList:
        a = json_file
        file_path_name = json_file_path_b + '/' + json_file
        # 截取文件名,用来命名图片
        name = os.path.splitext(file_path_name)[0]
        index = name + '.png'
        json_to_png(file_path_name, index)
        print(file_path_name, 'to', index)

2、按名称将A、B相同标签png的变化部分进行合并,使一对A、B的变化标签成为一张png

# 合并两个文件夹下相同名称的两张png标签
#
# 开发时间:2023/5/18 16:38
import os
from PIL import Image

def merge(path1, path2, path3):
    img1 = Image.open(path1)
    img2 = Image.open(path2)
    width, height = img1.size
    new_img = Image.new('L', (width, height), 0)
    for x in range(width):
        for y in range(height):
            pixel1 = img1.getpixel((x, y))
            pixel2 = img2.getpixel((x, y))
            if pixel1 == 255 or pixel2 == 255:
                new_img.putpixel((x, y), 255)
            else:
                new_img.putpixel((x, y), 0)

    file_name = os.path.split(path1)[1]

    path_new = os.path.join(path3, file_name)
    # 保存新的图片
    new_img.save(path_new)


# 提取需要合并的同名文件
A_file_path = 'Ajson'
A_fileList = os.listdir(A_file_path)

B_file_path = 'Bjson'
B_fileList = os.listdir(B_file_path)

result = 'result'

Alist = []
for file_a in A_fileList:
    Alist.append(file_a)

Blist = []
for file_b in B_fileList:
    Blist.append(file_b)

common_set = set(Alist).intersection(set(Blist))

common_list = list(common_set)

if len(common_list) == 0:
    print("这两个列表没有相同的元素")
else:
    print("这两个列表有相同的元素:")
    print(len(common_list))

    for item in common_list:
        print(item)
    print(len(common_list))

for item in common_list:
    path_a = os.path.join(A_file_path, item)
    path_b = os.path.join(B_file_path, item)
    path_result = result
    if not os.path.exists(path_result):
        os.makedirs(path_result)

    merge(path_a, path_b, path_result)
print('merge successfully!!!')

3、检测AB文件夹下的文件的交集并集情况,把AB中独有的图片放进result

# 检测AB文件夹下的文件的交集并集情况,把AB中独有的图片放进result
#
# 开发时间:2023/5/19 10:09
import os
import shutil

folder1 = "Ajson"
folder2 = "Bjson"
result = 'result'
if not os.path.exists(result):
    os.makedirs(result)

files1 = set(os.listdir(folder1))
files2 = set(os.listdir(folder2))

common_files = files1.intersection(files2)

# 获取不同的文件名
# different_files = files1.difference(files2).union(files2.difference(files1))
# A中独有的标签
different_filesA = files1.difference(files2)
# B中独有的标签
different_filesB = files2.difference(files1)

# 将AB独有的标签放进result
for a in different_filesA:
    pngA = os.path.join(folder1, a)
    pngA_new = os.path.join(result, a)
    shutil.copy(pngA, pngA_new)

for b in different_filesB:
    pngB = os.path.join(folder2, b)
    pngB_new = os.path.join(result, b)
    shutil.copy(pngB, pngB_new)

# 输出结果
print("相同的文件名:", common_files)
print("相同的文件数量:", len(common_files))

print("A独有的文件名:", different_filesA)
print("A独有的文件数量:", len(different_filesA))

print("B独有的文件名:", different_filesB)
print("B独有的文件数量:", len(different_filesB))

print('detection successfully!!!')

4、按照标签统计结果检索AB中对应的变化标签(此步骤如不需要可以不进行)

# 提取出result中的png对应于AB文件夹的jpg文件
#
# 开发时间:2023/5/25 8:27

import os
import shutil

folder1 = "A_rea"
folder2 = "B_rea"
result = 'result'
# 原始ab文件夹
allA = 'A'
allB = 'B'

if not os.path.exists(folder1):
    os.makedirs(folder1)
if not os.path.exists(folder2):
    os.makedirs(folder2)

# 获取result文件夹中的所有文件名
files_result = set(os.listdir(result))

# 修改后缀
name = []
for item in files_result:
    name.append(item.split('.')[0])

for i in name:
    imgName = i + '.jpg'
    pathA = os.path.join(folder1, imgName)
    pathB = os.path.join(folder2, imgName)
    oldA = os.path.join(allA, imgName)
    oldB = os.path.join(allB, imgName)
    shutil.copy(oldA, pathA)
    shutil.copy(oldB, pathB)
    # 输出结果
    print("正在处理:", oldA)
    print("文件数量:", len(name))
print('Same_A_B successfully!!!')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1111265.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MAC如何在根目录创建文件

在这之前先明确一下啥是根目录。 打开终端,输入cd /,然后输入 ls 查看根目录下有哪些文件 可以看到 usr、etc、opt 这些文件的地方才叫根目录,而不是以用户命名,可以看到音乐、应用程序、影片、桌面的地方哈 介绍一种叫做软连接…

C++算法:数据流的中位数

题目 中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。 例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFinder 类: MedianFinder() 初始化 MedianFin…

数据预处理—滑动窗口采样数据

一个简单的例子: # data: 这是要应用滑动窗口采样的输入数据,通常是一个序列,例如列表或NumPy数组。 # window_size: 这是滑动窗口的大小,表示每个窗口中包含的元素数量。 # step_size: 这是滑动窗口移动的步长,表示每…

(※)力扣刷题-栈和队列-用队列实现栈

255.用队列实现栈 使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 所以后面实现的时候会留下一个元素 top() – 获取栈顶元素 empty() – 返回栈是否为空 注意: 你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, …

2023年中国粘度指数改进剂行业需求现状及前景分析[图]

润滑油添加剂指用于提高润滑油使用性能、耐久性及功效,从而增强机械和发动机使用性能的产品,分为单剂和复合剂两大类产品。单剂产品主要是清净剂、分散剂、抗氧抗腐剂、极压抗磨剂、抗氧剂、增粘剂、防锈剂、降凝剂等具有单一特性的添加剂产品&#xff1…

存储数据保护技术——HyperClone克隆与HyperMirror卷镜像技术介绍

目录 HyperClone克隆 基本概念 克隆的特点 工作原理 注意事项 HyperMirror卷镜像 HyperClone克隆 基本概念 克隆是快照技术的一种;在不中断主机业务的情况下,对源数据在某个时间点的一致性数据副本,数据同完成后成为完整的数据副本 …

一天吃透Java集合面试八股文

内容摘自我的学习网站:topjavaer.cn 常见的集合有哪些? Java集合类主要由两个接口Collection和Map派生出来的,Collection有三个子接口:List、Set、Queue。 Java集合框架图如下: List代表了有序可重复集合&#xff0c…

【C++笔记】模板进阶

【C笔记】模板进阶 一、非类型模板参数二、类模板的特化三、模板的分离编译 一、非类型模板参数 我们之前学过的模板虽然能很好地帮我们实现泛型编程&#xff0c;比如我们可以让一个栈存储int类型的数据&#xff0c;一个栈存储double类型的数据&#xff1a; template <cla…

Git 为文件添加执行权限

背景 当你是一台Linux&#xff0c;想要给文件加权限很简单&#xff0c;只需要执行以下命令 chmod x filename就可以给文件添加执行权限&#xff0c;但是如果你是Windows那就很麻烦了 解决方案 假设这里有一个名为 file.sh 的文件&#xff0c;内容如下&#xff1a; #!/bin/…

视频剪辑SDK,实现高效的移动端视频编辑

为了满足企业对视频编辑的需求&#xff0c;美摄提供了iOS/Android端视频编辑SDK技术开发服务&#xff0c;帮助企业快速高效地制作高质量视频。本文将详细介绍美摄的视频编辑SDK的优势和特点&#xff0c;以及如何为企业提供技术解决方案。 随着智能手机的普及和移动互联网的发展…

Java_Jdbc

目录 一.JDBC概述 二.JDBC API 三.ResultSet[结果集] 四.Statement 五.PreparedStatement 六. JDBC API 总结 一.JDBC概述 JDBC 为访问不同的数据库提供了同一的接口&#xff0c;为使用着屏蔽了细节问题Java程序员使用JDBC 可以连接任何提供了 JDBC驱动的数据库系统&am…

(缺省参数)(函数重载)(引用)(内敛)(C++中的nullptr)

&#xff08;缺省参数&#xff09;&&#xff08;函数重载&#xff09;&&#xff08;引用&#xff09;&&#xff08;内敛&#xff09;&&#xff08;atuo用法&#xff09;&&#xff08;C中的NULL&#xff09; 1.缺省参数1.1缺省参数的概念1.2缺省参数的分类1…

谈谈电商App的压测

背景 最近恰逢双十一&#xff0c;大大小小的电商app在双十一之前都会做一次压测&#xff0c;曾经在小公司工作的时候很想知道大公司是如何压测的&#xff0c;有什么高深的压测工具没&#xff0c;本文就来揭露一下 压测真相 在确认使用什么压测工具进行压测之前&#xff0c;我…

(※)力扣刷题-栈和队列-用栈实现队列

使用栈实现队列的下列操作&#xff1a; push(x) – 将一个元素放入队列的尾部。pop() – 从队列首部移除元素。peek() – 返回队列首部的元素。empty() – 返回队列是否为空。 说明: 你只能使用标准的栈操作 – 也就是只有 push to top, peek/pop from top, size, 和 is empt…

R6G alkyne, 6-isomer可在反应中作为底物或催化剂发挥作用

试剂 | 基础知识概述&#xff08;部分&#xff09;: 英文名&#xff1a;R6G alkyne, 6-isomer 分子式&#xff1a;C30H29N3O4 分子量&#xff1a;495.57 Ex &#xff1a;518nm Em&#xff1a;542nm 规格标准&#xff1a;10mg、25mg、50mg&#xff0c;可提供mg级以及kg级的…

系统架构师备考倒计时16天(每日知识点)

1.信息化战略与实施 2.UML图&#xff08;12个&#xff09; 3.结构化设计&#xff08;耦合&#xff09; 4.SMP与AMP的区别&#xff08;多核处理器的工作方式&#xff09; 多核处理器一般有SMP和AMP两种不同的工作方式: SMP(对称多处理技术)&#xff1a;将2颗完全一样的处理器封…

24---WPF缓存

一、什么是缓存&#xff1a; 1.缓存指的是将需要频繁访问的网络内容存放在离用户较近、访问速度更快的系统中&#xff0c;以提高内容访问速度的一种技术。缓存服务器就是存放频繁访问内容的服务器。 2.缓存就是一个临时存放区域--离用户比较近 二、作用--意义---如果系统出现故…

郭明錤修正预测:苹果第二代AirTag推迟2025年量产

10月19日&#xff0c;知名分析师郭明錤调整今年8月关于苹果第2代AirTag的预测&#xff0c;表示该产品量产时间从先前预测的2024年Q4延迟至2025年&#xff0c;并进一步推迟新款上市日期。 AirTag是苹果公司推出的一款蓝牙设备&#xff0c;配合苹果设备的“查找”APP&#xff0c…

【综述】Diffusion Models: A Comprehensive Survey of Methods and Applications

Diffusion Models: A Comprehensive Survey of Methods and Applications 论文&#xff1a;https://arxiv.org/abs/2209.00796 github&#xff1a;https://github.com/YangLing0818/Diffusion-Models-Papers-Survey-Taxonomy 目录 Diffusion Models: A Comprehensive Survey…

双指针——复写零

一&#xff0c;题目要求 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改&#xff0c;不要从函数返回任何东…