news 2026/4/18 14:09:12

可见光,红外,分割图表

作者头像

张小明

前端开发工程师

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进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 8:24:39

AI驱动的企业创新生态系统评估:内外部创新能力量化模型

AI驱动的企业创新生态系统评估:内外部创新能力量化模型关键词:AI驱动、企业创新生态系统、内外部创新能力、量化模型、评估摘要:本文聚焦于AI驱动下的企业创新生态系统评估,详细阐述了内外部创新能力量化模型。首先介绍了研究的背…

作者头像 李华
网站建设 2026/4/18 12:06:08

当开题报告的“灵魂拷问”遇上AI:Paperzz如何用3000字重构你的学术启动逻辑——从选题焦虑到结构自洽的完整闭环指南

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿 paperzz - 开题报告https://www.paperzz.cc/proposal 前言:我们为什么需要重新理解“开题报告”的本质? 如果你正在为一份开题报告焦头烂额,那不是你能力不足&#xff…

作者头像 李华
网站建设 2026/4/17 17:59:55

网络进阶教程:仅部署一个中心节点,即可访问局域网内所有设备

小白曾经一度认为:每台设备都需要安装节点小宝,然后通过节点小宝控制台进行调整组网状态实现对每台设备的控制…… 但是小白肤浅了。 经过小白这一段时间的测试,其实只需要在家中局域网内选择一台性能稳定且24小时开机的设备(比…

作者头像 李华
网站建设 2026/4/18 10:50:07

华为、大疆之后,下一个万亿赛道“代表作”会在CES Asia2026诞生吗?

从华为重构消费电子生态,到大疆定义全球无人机行业,中国科技企业的“代表作”始终是万亿赛道的核心引擎。如今,AI赋能、低空经济等国家战略性新兴产业加速崛起,新的行业标杆呼之欲出。CES Asia2026亚洲消费电子展将于2026年6月10日…

作者头像 李华
网站建设 2026/4/18 12:04:31

Neo4j数据库中批量插入数据(数据在.csv文件中)

Neo4j数据库中批量插入数据(数据在.csv文件中)1、数据格式描述:2、将数据导入到Neo4j数据库中1、数据格式描述: 数据集介绍: bank.csv - 汽车品牌数据 bank: 汽车品牌名称 count: 该品牌的车型数量 url: 汽车之家…

作者头像 李华
网站建设 2026/4/18 8:44:48

人均60元的精品烘焙店正密集进入购物中心

烘焙赛道格局生变:精品化趋势下的机遇与挑战近年来,国内烘焙市场正经历一轮结构性调整。从门店扩张态势到消费偏好转变,这一传统行业展现出新的活力与竞争维度。首店经济中的烘焙力量在商业地产领域,烘焙品类正成为招商关注的重点…

作者头像 李华