news 2025/12/31 20:08:52

可见光,红外,分割图表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
可见光,红外,分割图表

import os import cv2 import numpy as np from PIL import Image import random # ====================== 配置参数(已按指定路径修改)===================== # 1. 各图像文件夹的绝对路径 IR_DIR = r"D:\pycharm\DiFusionSeg-master\dataset\MSRS\test\ir" # 红外图像路径 VI_DIR = r"D:\pycharm\DiFusionSeg-master\dataset\MSRS\test\vi" # 可见光图像路径 SEG_DIR = r"D:\pycharm\DiFusionSeg-master\out\seg" # 分割图路径 # 2. 输出图像保存路径 OUTPUT_PATH = "msrs_10x3_grid.png" # 3. 类别颜色映射(可根据实际像素值调整) # 基础类别:0(unlabeled)、1(car)、2(person)、3(bike)、4(curve)、5(car_stop)、6(guardrail)、7(color_cone)、8(bump) COLOR_MAP = { 0: (0, 0, 0), # 未标注 - 黑色 1: (128, 0, 128), # 汽车 - 紫色 2: (0, 255, 0), # 行人 - 绿色 3: (0, 0, 255), # 自行车 - 蓝色 4: (255, 255, 0), # 弯道 - 黄色 5: (255, 165, 0), # 停车区 - 橙色 6: (128, 128, 0), # 护栏 - 橄榄绿 7: (255, 0, 255), # 彩色锥桶 - 洋红 8: (0, 255, 255), # 减速带 - 青色 255: (128, 128, 255) # 新增:处理255像素值(如分割图中的有效类别) } # 4. 图像缩放尺寸(统一尺寸,避免拼接时大小不一致) RESIZE_SIZE = (480, 320) # (宽度, 高度) # 5. 分割图类型配置(根据实际情况选择:"gray" 灰度图 / "color" 彩色图) SEG_TYPE = "auto" # 自动检测:优先彩色图,否则灰度图 # ============================================================================= def load_image(path, is_gray=False): """加载图像并缩放""" if is_gray: # 加载红外图像(灰度图)并转为3通道 img = cv2.imread(path, cv2.IMREAD_GRAYSCALE) if img is None: raise FileNotFoundError(f"无法加载图像:{path}") img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) else: # 加载可见光图像(彩色图)并转RGB img = cv2.imread(path) if img is None: raise FileNotFoundError(f"无法加载图像:{path}") img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 统一缩放尺寸 img = cv2.resize(img, RESIZE_SIZE, interpolation=cv2.INTER_LINEAR) return img def seg2color(seg_img): """ 将灰度分割图转换为伪彩色图 适配场景: 1. 像素值0~8(基础类别) 2. 像素值1~9(减1后匹配0~8) 3. 像素值包含255(单独映射) """ color_img = np.zeros((seg_img.shape[0], seg_img.shape[1], 3), dtype=np.uint8) # 步骤1:获取分割图的像素值范围,自动适配 seg_min = seg_img.min() seg_max = seg_img.max() # 情况1:像素值是1~9,减1后匹配0~8 if seg_min == 1 and seg_max == 9: seg_img = seg_img - 1 # 情况2:像素值是0~255(仅保留COLOR_MAP中的键) elif seg_max > 9: # 只处理COLOR_MAP中存在的像素值,其余设为黑色(可自定义) pass # 步骤2:映射颜色 for label, color in COLOR_MAP.items(): color_img[seg_img == label] = color return color_img def load_seg_image(seg_file, seg_type="auto"): """ 加载分割图,支持自动检测类型 seg_type: "gray"(强制灰度)、"color"(强制彩色)、"auto"(自动检测) """ # 第一步:加载原始图像,判断类型 raw_img = cv2.imread(seg_file) if raw_img is None: raise FileNotFoundError(f"无法加载分割图:{seg_file}") # 自动检测类型:单通道=灰度图,三通道=彩色图 if seg_type == "auto": if len(raw_img.shape) == 2 or (len(raw_img.shape) == 3 and raw_img.shape[2] == 1): seg_type = "gray" else: seg_type = "color" # 第二步:根据类型处理分割图 if seg_type == "gray": # 加载为灰度图 seg_gray = cv2.imread(seg_file, cv2.IMREAD_GRAYSCALE) seg_gray = cv2.resize(seg_gray, RESIZE_SIZE, interpolation=cv2.INTER_NEAREST) # 打印像素值信息(便于调试) print(f"\n分割图 {os.path.basename(seg_file)} 灰度信息:") print(f"像素值范围:{seg_gray.min()} ~ {seg_gray.max()}") print(f"唯一像素值:{np.unique(seg_gray)[:10]}") # 只显示前10个 # 转换为伪彩色图 seg_img = seg2color(seg_gray) else: # 加载为彩色图,直接缩放 seg_img = cv2.cvtColor(raw_img, cv2.COLOR_BGR2RGB) seg_img = cv2.resize(seg_img, RESIZE_SIZE, interpolation=cv2.INTER_LINEAR) return seg_img def get_image_pairs(vi_dir, ir_dir, seg_dir): """获取可见光、红外、分割图的路径对(按文件名匹配)""" # 获取所有可见光图像文件名 vi_files = [f for f in os.listdir(vi_dir) if f.endswith((".png", ".jpg", ".jpeg"))] # 随机选择10张(若不足10张则取全部) selected_files = random.sample(vi_files, min(10, len(vi_files))) img_pairs = [] for file_name in selected_files: # 拼接各图像的完整路径 vi_file = os.path.join(vi_dir, file_name) ir_file = os.path.join(ir_dir, file_name) seg_file = os.path.join(seg_dir, file_name) # 检查文件是否存在(分割图可能后缀不同,尝试兼容) seg_file = check_seg_file(seg_file) if os.path.exists(vi_file) and os.path.exists(ir_file) and seg_file is not None: img_pairs.append((vi_file, ir_file, seg_file)) return img_pairs def check_seg_file(seg_file): """兼容分割图的不同后缀(如.png/.jpg),返回存在的路径""" # 若原路径存在,直接返回 if os.path.exists(seg_file): return seg_file # 尝试替换后缀 base = os.path.splitext(seg_file)[0] for ext in [".png", ".jpg", ".jpeg", ".bmp"]: new_file = base + ext if os.path.exists(new_file): return new_file return None def create_grid(img_pairs): """创建10行3列的网格图像""" # 单张图像的高度和宽度 h, w = RESIZE_SIZE[1], RESIZE_SIZE[0] # 网格画布尺寸:行数×3列 grid_h = h * len(img_pairs) grid_w = w * 3 grid = np.zeros((grid_h, grid_w, 3), dtype=np.uint8) for i, (vi_file, ir_file, seg_file) in enumerate(img_pairs): # 加载图像 vi_img = load_image(vi_file) ir_img = load_image(ir_file, is_gray=True) # 加载分割图(自动适配灰度/彩色) seg_img = load_seg_image(seg_file, seg_type=SEG_TYPE) # 计算当前行的起始位置 row_start = i * h # 粘贴到网格中:第一列(可见光)、第二列(红外)、第三列(分割图) grid[row_start:row_start+h, 0:w, :] = vi_img grid[row_start:row_start+h, w:2*w, :] = ir_img grid[row_start:row_start+h, 2*w:3*w, :] = seg_img return Image.fromarray(grid) if __name__ == "__main__": try: # 1. 获取图像对 img_pairs = get_image_pairs(VI_DIR, IR_DIR, SEG_DIR) if len(img_pairs) == 0: print("错误:未找到匹配的图像对,请检查路径和文件名!") else: print(f"成功加载{len(img_pairs)}组图像对") # 2. 创建网格图像 grid_img = create_grid(img_pairs) # 3. 保存并显示图像 grid_img.save(OUTPUT_PATH) grid_img.show() print(f"\n网格图像已保存至:{os.path.abspath(OUTPUT_PATH)}") except Exception as e: print(f"\n运行出错:{str(e)}")

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/16 19:03:14

当券商成立互联网分公司,面向长尾客户的“智能化总攻”开始了

近期,又一家头部券商宣布成立互联网分公司,在业内激起不小波澜。有人质疑这是“新瓶装旧酒”,但真正洞察行业演进的人会明白:这并非简单回归,而是一场面向AI时代客户经营体系的重构。 十年前,互联网分公司的…

作者头像 李华
网站建设 2025/12/29 10:04:29

13. 搜索引擎-ES-ES集群

文章目录前言一、搭建ES集群1.1 创建ES集群1.2 集群状态监控1.3创建索引库二、集群脑裂问题2.1.集群职责划分2.2.脑裂问题三、集群分布式存储3.1.分片存储测试3.2.分片存储原理四、集群分布式查询五、集群故障转移前言 ES集群‌ 一、搭建ES集群 1.1 创建ES集群 部署es集群可…

作者头像 李华
网站建设 2025/12/21 3:46:28

LobeChat能否接入实时翻译插件?多语言交流解决方案

LobeChat能否接入实时翻译插件?多语言交流解决方案 在跨国团队协作日益频繁的今天,一个中国工程师与德国同事讨论技术方案时,可能正依赖AI助手做实时沟通桥梁;一位留学生在查阅英文论文时,希望对话模型能直接用母语解释…

作者头像 李华
网站建设 2025/12/16 19:01:06

15. 实时数据-SpringBoot集成WebSocket

文章目录 前言一、添加依赖(Maven)二、配置 WebSocket1. 创建 WebSocket 配置类2. 实现 WebSocket 处理器 三、前端测试(HTML JS)四、启动类(标准 Spring Boot 启动类)五、可选:使用 STOMP ove…

作者头像 李华
网站建设 2025/12/16 18:59:52

30、FreeBSD 图形界面配置与 KDE 桌面环境使用指南

FreeBSD 图形界面配置与 KDE 桌面环境使用指南 1. X Window 系统配置 X Window 系统为 FreeBSD 提供了类似于 Windows 的图形用户界面。它与窗口管理器协同工作,为用户打造一个高效的工作环境。 1.1 关键配置文件与程序 XF86Config :这是控制 X Window 系统各种属性的文本…

作者头像 李华
网站建设 2025/12/16 18:59:30

项目中绝对位置和相对位置的具体应用解析

这个通常用于有外部库或者文件输入时,使用相对路径可避免代码复制到别的PC端没法使用的情况基础概念:路径分隔符的作用​在文件系统中,路径用于定位文件或目录的位置。反斜杠 \ 是 Windows 系统中的路径分隔符,而正斜杠 / 通常用于…

作者头像 李华