Python项目实战:将3D灰度图像转换为3D彩色图像

2023-11-13

(3D-GRAY) to (3D-RGB):使用颜色映射的方式,将灰度值映射到彩色空间中的特定颜色。

一、多维数组:10x12x14

channel重复:在RGB中,将【灰度图】分别赋值给【R/G/B图】,显示彩色图。

在这里插入图片描述

import numpy as np
import tifffile

# 加载16位灰度图像
image_data = tifffile.imread('gray_image_raw.tif')        # 原始-灰度图像(16-bit): 50, 444, 1112

# 将图像的数据类型转换为32位整数,以便进行操作
image_data = image_data.astype(np.uint32)

# 将灰度图像转换为彩色图像
color_image = np.zeros((*image_data.shape, 3), dtype=np.uint8)
color_image[..., 0] = (image_data >> 8) & 0xFF  # 红色通道
color_image[..., 1] = (image_data >> 4) & 0xFF  # 绿色通道
color_image[..., 2] = image_data & 0xFF  # 蓝色通道
###########################################################################
# (image_data >> 8) & 0xFF
# 		操作:通过右移8位(相当于除以256)来实现的,然后使用位运算AND操作符&和掩码0xFF来保留最低8位。
# 		作用:将16位图像的灰度范围缩放到0-255,适合于8位彩色图像的显示或处理。
###########################################################################

# 将彩色图像保存为新的tif文件
tifffile.imwrite('color_image.tif', color_image)

channel叠加1:将【灰度图】分别赋值给【R/G/B图】,然后将【灰度图】与【G图】进行叠加,显示【灰色底层+绿色顶层】。

在这里插入图片描述

import numpy as np
import tifffile

"""image_data与image_data_gray的图像尺度必须一致"""
# (1)读取图像
gray_image_raw = tifffile.imread('gray_image_raw.tif')        	# 原始-灰度图像(16-bit):[50, 444, 1112]
gray_image_circle = tifffile.imread('gray_image_circle.tif')	# 空心圆-灰度图像(16-bit):[50, 444, 1112]

# (2)新建彩色图像
color_image = np.zeros((*gray_image_raw.shape, 3), gray_image_raw.dtype)  # 空心圆-彩色图像(16-bit):[50, 444, 1112, 3]
"""*gray_image_raw.shape表示将gray_image_raw.shape中的元素展开,并将它们作为参数传递给函数或操作。"""
color_image[..., 0] = gray_image_raw
color_image[..., 1] = gray_image_raw
color_image[..., 2] = gray_image_raw

# (3)将gray_image_circle中65535的值(空心圆=65535)赋给color_image
# color_image[gray_image_circle == 65535, 0] = 65535              # 65535表示灰度图像中的最大像素值,0表示红色通道(红色显示)。
color_image[gray_image_circle == 65535, 1] = 65535            # 65535表示灰度图像中的最大像素值,1表示绿色通道(绿色显示)。
# color_image[gray_image_circle == 65535, 2] = 65535            # 65535表示灰度图像中的最大像素值,2表示蓝色通道(蓝色显示)。

# (4)保存图像
tifffile.imwrite('color_image.tif', color_image)
print(color_image.shape[0], color_image.shape[1], color_image.shape[2], color_image.shape[3])
# [50, 444, 1112, 3]

channel叠加2:将【灰度图】只赋值给【R图】,然后将【灰度图】与【G图】进行叠加,显示【红色底层+绿色顶层】。

在这里插入图片描述

import numpy as np
import tifffile

"""image_data与image_data_gray的图像尺度必须一致"""
# (1)读取图像
gray_image_raw = tifffile.imread('gray_image_raw.tif')        	# 原始-灰度图像(16-bit):[50, 444, 1112]
gray_image_circle = tifffile.imread('gray_image_circle.tif')	# 空心圆-灰度图像(16-bit):[50, 444, 1112]

# (2)新建彩色图像
color_image = np.zeros((*gray_image_raw.shape, 3), gray_image_raw.dtype)  # 空心圆-彩色图像(16-bit):[50, 444, 1112, 3]
"""*gray_image_raw.shape表示将gray_image_raw.shape中的元素展开,并将它们作为参数传递给函数或操作。"""
color_image[..., 0] = gray_image_raw
# color_image[..., 1] = gray_image_raw
# color_image[..., 2] = gray_image_raw

# (3)将gray_image_circle中65535的值(空心圆=65535)赋给color_image
# color_image[gray_image_circle == 65535, 0] = 65535              # 65535表示灰度图像中的最大像素值,0表示红色通道(红色显示)。
color_image[gray_image_circle == 65535, 1] = 65535            # 65535表示灰度图像中的最大像素值,1表示绿色通道(绿色显示)。
# color_image[gray_image_circle == 65535, 2] = 65535            # 65535表示灰度图像中的最大像素值,2表示蓝色通道(蓝色显示)。

# (4)保存图像
tifffile.imwrite('color_image.tif', color_image)
print(color_image.shape[0], color_image.shape[1], color_image.shape[2], color_image.shape[3])
# [50, 444, 1112, 3]

channel拼接:(10x12x14)x1+(10x12x14)x3=(10x12x14)x4

在这里插入图片描述

import numpy as np
import tifffile

# image_data与image_data_gray的图像尺度必须一致
gray_image_raw = tifffile.imread('gray_image_raw.tif')        # 原始-灰度图像(16-bit): [50, 444, 1112]
gray_image_circle = tifffile.imread('gray_image.tif')			# 空心圆-灰度图像(16-bit): [50, 444, 1112]

color_image = np.zeros((*gray_image_raw.shape, 3))          	# 空心圆-彩色图像(16-bit): [50, 444, 1112, 3]
# *gray_image_raw.shape表示将gray_image_raw.shape中的元素展开,并将它们作为参数传递给函数或操作。
color_image[..., 0] = gray_image_raw
color_image[..., 1] = gray_image_raw
color_image[..., 2] = gray_image_raw

# 将gray_image_circle中65535的值(空心圆=65535)赋给color_image
color_image[gray_image_circle == 65535, 0] = 65535              # 65535表示灰度图像中的最大像素值,0表示红色通道(红色显示)。
# color_image[gray_image_circle == 65535, 1] = 65535            # 65535表示灰度图像中的最大像素值,1表示绿色通道(绿色显示)。
# color_image[gray_image_circle == 65535, 2] = 65535            # 65535表示灰度图像中的最大像素值,2表示蓝色通道(蓝色显示)。

color_image = color_image.astype(gray_image_raw.dtype)          # 将数据类型转换为与image_data一样

# 将灰度图像和调整后的 RGB 图像进行合并
gray_image_raw = np.expand_dims(gray_image_raw, axis=-1)
merged_image = np.concatenate((gray_image_raw, color_image), axis=3)

# 将彩色图像保存为新的tif文件
tifffile.imwrite('color_image.tif', merged_image)
print(merged_image.shape[0], merged_image.shape[1], merged_image.shape[2], merged_image.shape[3])		
# [50, 444, 1112, 4]

二、二维数组:10x10

channel叠加:10x12x1+10x12x3=10x12x3

在这里插入图片描述

import cv2
import numpy as np

rgb_image = cv2.imread('image.jpg', cv2.IMREAD_COLOR)
gray_image = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2GRAY)

# 创建一个空白的多通道图像
height, width, _ = rgb_image.shape
merged_image = np.zeros((height, width, 3), dtype=np.uint8)

# 将灰度图像的数据复制到第四个通道
merged_image[..., 0] = gray_image
merged_image[..., 1] = gray_image
merged_image[..., 2] = gray_image

merged_image[..., 2] = rgb_image[..., 2]

# 显示合并后的图像
cv2.imshow("Merged Image", merged_image)
cv2.imshow("gray_image", gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python项目实战:将3D灰度图像转换为3D彩色图像 的相关文章

  • python:查找围绕某个 GPS 位置的圆的 GPS 坐标的优雅方法

    我有一组以十进制表示的 GPS 坐标 并且我正在寻找一种方法来查找每个位置周围半径可变的圆中的坐标 这是一个例子 http green and energy com downloads test circle html我需要什么 这是一个圆
  • 保存为 HDF5 的图像未着色

    我目前正在开发一个将文本文件和 jpg 图像转换为 HDF5 格式的程序 用HDFView 3 0打开 似乎图像仅以灰度保存 hdf h5py File Sample h5 img Image open Image jpg data np
  • 中断 Select 以添加另一个要在 Python 中监视的套接字

    我正在 Windows XP 应用程序中使用 TCP 实现点对点 IPC 我正在使用select and socketPython 2 6 6 中的模块 我有三个 TCP 线程 一个读取线程通常会阻塞select 一个通常等待事件的写入线程
  • Django 的内联管理:一个“预填充”字段

    我正在开发我的第一个 Django 项目 我希望用户能够在管理中创建自定义表单 并向其中添加字段当他或她需要它们时 为此 我在我的项目中添加了一个可重用的应用程序 可在 github 上找到 https github com stephen
  • 如何用python脚本控制TP LINK路由器

    我想知道是否有一个工具可以让我连接到路由器并关闭它 然后从 python 脚本重新启动它 我知道如果我写 import os os system ssh l root 192 168 2 1 我可以通过 python 连接到我的路由器 但是
  • 安装了 32 位的 Python,显示为 64 位

    我需要运行 32 位版本的 Python 我认为这就是我在我的机器上运行的 因为这是我下载的安装程序 当我重新运行安装程序时 它会将当前安装的 Python 版本称为 Python 3 5 32 位 然而当我跑步时platform arch
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • Python getstatusoutput 替换不返回完整输出

    我发现了这个很棒的替代品getstatusoutput Python 2 中的函数在 Unix 和 Windows 上同样有效 不过我觉得这个方法有问题output被构建 它只返回输出的最后一行 但我不明白为什么 任何帮助都是极好的 def
  • 将 python2.7 与 Emacs 24.3 和 python-mode.el 一起使用

    我是 Emacs 新手 我正在尝试设置我的 python 环境 到目前为止 我已经了解到在 python 缓冲区中使用 python mode el C c C c将当前缓冲区的内容加载到交互式 python shell 中 显然使用了什么
  • 使用字典映射数据帧索引

    为什么不df index map dict 工作就像df column name map dict 这是尝试使用index map的一个小例子 import pandas as pd df pd DataFrame one A 10 B 2
  • 为什么 PyYAML 花费这么多时间来解析 YAML 文件?

    我正在解析一个大约 6500 行的 YAML 文件 格式如下 foo1 bar1 blah name john age 123 metadata whatever1 whatever whatever2 whatever stuff thi
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • Jupyter Notebook 找不到 Python 模块

    不知道发生了什么 但每当我使用 ipython 氢 原子 或 jupyter 笔记本时都找不到任何已安装的模块 我知道我安装了 pandas 但笔记本说找不到 我应该补充一点 当我正常运行脚本时 python script py 它确实导入
  • import matplotlib.pyplot 给出 AttributeError: 'NoneType' 对象没有属性 'is_interactive'

    我尝试在 Pycharm 控制台中导入 matplotlib pyplt import matplotlib pyplot as plt 然后作为回报我得到 Traceback most recent call last File D Pr
  • 仅第一个加载的 Django 站点有效

    我最近向 stackoverflow 提交了一个问题 标题为使用mod wsgi在apache上多次请求后Django无限加载 https stackoverflow com questions 71705909 django infini
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它
  • 如何断言 Unittest 上的可迭代对象不为空?

    向服务提交查询后 我会收到一本字典或一个列表 我想确保它不为空 我使用Python 2 7 我很惊讶没有任何assertEmpty方法为unittest TestCase类实例 现有的替代方案看起来并不正确 self assertTrue
  • 使用for循环时如何获取前一个元素? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 循环内的上一个和下一个值 https stackoverflow com questions 1011938 python previous and next values inside
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • 如何计算Python中字典中最常见的前10个值

    我对 python 和一般编程都很陌生 所以请友善 我正在尝试分析包含音乐信息的 csv 文件并返回最常听的前 n 个乐队 从下面的代码中 每听一首歌曲都是一个列表中的字典条目 格式如下 album Exile on Main Street

随机推荐

  • mac上使用svn

    第一步 使用Homebrew安装subversion Homebrew不知道怎么安装的话 请自行百度 brew install subversion 第二步 使用如下的命令进行检查是否安装了这个软件 brew list 得到如下结果 使用如
  • vue常用组件库

    Vue是主流的前端框架一 Vue js UI组件 element 饿了么出品的Vue2的web UI工具套件 Vux 基于Vue和WeUI的组件库 mint ui Vue 2的移动UI元素 iview 基于 Vuejs 的开源 UI 组件库
  • 32黑马QT笔记之QPixmap和QImage的相互转换

    32黑马QT笔记之QPixmap和QImage的相互转换 1 QPixmap与QImage的互相转换 1 头文件 void paintEvent QPaintEvent 2 实现 cpp文件 void Widget paintEvent Q
  • 敏捷开发系列终极之旅 第六站(像橄榄球运动一样富有激情的SCRUM)

    由来 为什么是Scrum Scrum原本的意思是橄榄球运动的一个专业术语 指 在橄榄球比赛中 双方前锋站在一起紧密相连 当球在他们之间投掷时他们奋力争球 在敏捷开发系列中 把一种开发流程命名为Scrum 其实就意味着 这种敏捷开发的流程 就
  • 解决Android手机root仍然出现adbd connot run as root in production build

    对于手机已经root 但是使用 adb root命令仍然出新adbd connot run as root in production build 原因是手机固件里面设置了adb shell 禁止root 解决方法 下载文件 http do
  • Linux文件、磁盘管理的一些命令:

    Linux文件 磁盘管理的一些命令 Num01 gt ls ls 列出目录的内容 linux文件或目录名称英文最长可有255个字符 中文最长127个字符 表示当前目录 以 开头的文件为隐藏文件 需要以 a参数才能显示 表示上级目录或父目录
  • Training a deep autoencoder or a classifier on MNIST digits_之调试运行与理解

    运行这个程序的主要目的 深入理解deep autoencoder 的基本原理和基本架构 搞明白是如何搭建起来的 弄清它是如何训练学习的 又是如何提取目标的特征的 最终又是怎样分类的 代码主程序如下 mnistdeepauto m plain
  • PHP计算时间差

    时间计算 距离现在多长时间 function format date time t time time f array 31536000 gt 年 2592000 gt 个月 604800 gt 星期 86400 gt 天 3600 gt
  • Web应用下实现定时任务简便方法

    在WEB应用下实现定时任务的简便方法 在web方式下 如果我们要实现定期执行某些任务的话 除了用quartz等第三方开源工具外 我们可以使用Timer和TimeTask来完成指定的定时任务 第一步 创建一个任务管理类 实现ServletCo
  • 基于QT的人脸识别考勤管理系统【一】

    前言 上篇我们已经用opencv实现了人脸识别https blog csdn net qq 42449351 article details 99052241 现在我们就用人脸识别来做一个考勤管理系统 该系统开发工具是 win10 Qt C
  • Numpy学习笔记三——数组切片、bool索引、掩码和花哨索引

    Numpy数组切片 bool索引 掩码和花哨索引 数组切片 slice 数组切片的公式为 my array start end step start end step 示例1 import numpy as np 设置随机种子 np ran
  • mfc入门基础(一)-单文档应用程序框架

    最近因为相关业务 需要接触下mfc的一些老代码 但是mfc上手并没有qt那么简单 所以四处寻找学习资料 发现一个写的挺好的教程 这边我进行转载下 学习的过程中进行了一些修改 总结下 此处附上原文链接 鸡啄米MFC入门系列教程 逸适安然的博客
  • Python爬虫三:抓取链家已成交二手房信息(58W数据)

    环境 Windows7 python3 6 Pycharm2017 目标 抓取链家北京地区已成交二手房信息 无需登录 如下图 户型 朝向 成交时间价格等 保存到csv 最后一共抓取约58W数据 程序运行8h 全部文章 京东爬虫 链家爬虫 美
  • 本人遇到的spring事务之UnexpectedRollbackException异常解决笔记

    本人最近在使用spring事务管理的过程中遇到如下异常 导致服务端抛出500给前端 让搞前端的哥们抱怨我心里着实不爽 前前后后折腾了近半个小时才得于解决 今天就做个笔记 以免日后又犯这个错误 好了 错误是这样的 org springfram
  • Linux环境下 sonar、sonar-scanner、cppcheck配置并汉化

    所需安装包以及插件 我的文件夹如下 文件最好按我的方式存放 以免后面修改路径 下载文件并复制到Linux环境 下载以上所有文件 下载链接 链接 https pan baidu com s 1WUYqFg1MEqVEzbb sn49Ig 提取
  • 数据分析师收藏:关于数据挖掘你想了解的都在这

    随着计算机技术的革新和网络媒体的快速发展 人们的生活以及企业发展进入了高速信息数字化时代 每天的生活以及生产都要产生大量的数据 例如交通 网络 文字 方位等 但是人们很少能够意识到这些丰富数据中隐藏了有价值的信息 什么是数据挖掘 2009年
  • 线性回归与逻辑回归的区别

    因 直 线 一 线性回归与逻辑回归的区别 1 线性回归要求因变量服从正态分布 logistic回归对变量分布没有要求 2 线性回归要求因变量 Y 是连续性数值变量 而logistic回归要求因变量是分类型变量 3 线性回归要求自变量和因变量
  • 动态代理及实现

    反射中Method方法 jdk动态代理 1 InvocationHandler接口 通俗来讲 InvocationHandler接口表示你的代理要干什么 做什么事 2 Method类 method invoke 此invoke和Invoca
  • 按键控制蜂鸣器实验

    实验任务 本节实验任务是使用领航者上的PL KEY0按键来控制蜂鸣器发声 初始状态为蜂鸣器鸣叫 按下按键后蜂鸣器停止鸣叫 再次按下开关 蜂鸣器重新鸣叫 模块示意图 按键消抖 通常我们所使用的开关为机械弹性开关 当我们按下或松开按键时 由于弹
  • Python项目实战:将3D灰度图像转换为3D彩色图像

    文章目录 3D GRAY to 3D RGB 使用颜色映射的方式 将灰度值映射到彩色空间中的特定颜色 一 多维数组 10x12x14 channel重复 在RGB中 将 灰度图 分别赋值给 R G B图 显示彩色图 channel叠加1 将