将.tiff格式图片转换为可视化的png,jpg,bmp等格式(附代码)

news2024/11/18 11:27:11

目前常用的.tiff格式图片转png格式图片,搜了一下,多数都是第三方平台直接转换,需要米,其实大可不必,自己撸代码就可以直接转换。

TIFF(Tagged Image File Format)是一种灵活的位图格式,主要用来存储包括照片和艺术图在内的图像。它最初由Aldus公司与微软公司一起为PostScript打印开发。TIFF与JPEG和PNG一起成为流行的高位彩色图像格式。TIFF是一个灵活适应性强的文件格式,通过在文件头中包含“标签”它能够在一个文件中处理多幅图像和数据。

目录

  • 一、.tiff格式图片
  • 二、tiff转png,jpg代码
    • 2.1 代码环境准备
    • 2.2 代码参数修改
    • 2.3 权重文件
    • 2.4 单帧转换代码
      • 2.4.1 源码包下载
    • 2.5 批量多帧转换代码
  • 三、转换效果
    • 3.1 转换测试场景1
    • 3.2 转换测试场景2
    • 3.3 转换测试场景3
    • 3.4 转换测试场景4
    • 3.5 转换测试场景5
    • 3.6 批量转换效果
  • 四、总结

一、.tiff格式图片

在Windows电脑端直接使用电脑工具打开.tiff格式图片,只看得到白色,这是因为.tiff格式的图片像素值超过255了,显示时都被强制转为了255显示,随便挑一副.tiff格式图片及查看像素值,如下:
在这里插入图片描述

在这里插入图片描述

为了直观查看图片中内容,需要转换为显示器能正常显示了png,jpg,bmp等可视化显示。

二、tiff转png,jpg代码

2.1 代码环境准备

使用此代码需要在Pytorch环境中才能正常运行,Pytorch的安装参考博文:Pytorch安装,Pytorch官网链接为:Pytorch官网安装

我自己的Pytorch版本及Python版本号参考如下:

在这里插入图片描述

2.2 代码参数修改

学者使用代码时只需修改图片路径和保存图片的路径即可。

在这里插入图片描述

2.3 权重文件

在我提供的源码包中权重文件,具体位置如下,在isp文件中:

在这里插入图片描述

2.4 单帧转换代码

下面是tiff转换png格式的完整代码,该代码就是我提供的源码包中的tif_To_png.py文件。
在这里插入图片描述


import cv2
import numpy as np
import torch

def pack_gbrg_raw(raw):                                               # 定义一个名为pack_gbrg_raw的函数,它接受一个参数raw,这个参数是一个GBRG格式的Bayer原始图像
    #pack GBRG Bayer raw to 4 channels
    black_level = 240                                                 # 定义黑色和白色的级别。这两个值用于后续的图像归一化。
    white_level = 2**12-1
    im = raw.astype(np.float32)                                       # 将输入的原始图像转换为浮点数类型
    im = np.maximum(im - black_level, 0) / (white_level-black_level)  # 对图像进行归一化处理,使其值在0到1之间

    im = np.expand_dims(im, axis=2)                                   # 在第三个维度(即通道维度)上为图像增加一个维度。
    img_shape = im.shape
    H = img_shape[0]                                                  # 获取图像的形状,并将高度和宽度分别存储在H和W中。
    W = img_shape[1]

    out = np.concatenate((im[1:H:2, 0:W:2, :],          # r           # 将图像的四个通道(R,Gr,B,Gb)沿着第三个维度(即通道维度)进行拼接。
                          im[1:H:2, 1:W:2, :],          # gr
                          im[0:H:2, 1:W:2, :],          # b
                          im[0:H:2, 0:W:2, :]), axis=2) # gb
    return out

def tensor2numpy(raw):  # raw: 1 * 4 * H * W
    input_full = raw.permute((0, 2, 3, 1))   # 1 * H * W * 4
    input_full = input_full.data.cpu().numpy()
    output = np.clip(input_full,0,1)
    return output

def preprocess(raw):
    input_full = raw.transpose((0, 3, 1, 2))
    input_full = torch.from_numpy(input_full)
    input_full = input_full.cuda()
    return input_full


img = cv2.imread("tif_images/4.tiff",-1)                           # 读入tiff格式图片
img = np.expand_dims(pack_gbrg_raw(img), axis=0)

isp = torch.load('isp/ISP_CNN.pth')

test_gt = (img - 240) / (2 ** 12 - 1 - 240)

gt_raw_frame = test_gt * (2 ** 12 - 1 - 240) + 240
gt_srgb_frame = tensor2numpy(isp(preprocess(gt_raw_frame)))[0]

img_png = np.uint8(gt_srgb_frame * 255)

cv2.imwrite("result_images/4.png",img_png)                         # 保存转换后的png或jpg图片路径及图片名称
cv2.imshow("img",img_png)
cv2.waitKey()
cv2.destroyAllWindows()

想要正常运行上面代码,还需要一个脚本文件models.py,该代码我放在了源码包中,学者自行下载使用。
在这里插入图片描述

2.4.1 源码包下载

源码包的下载链接为:源码包,提取码:5kh2

源码包中我提供了5张.tiff格式的测试图片,在tif_images文件夹中,如下:
在这里插入图片描述

2.5 批量多帧转换代码

学者使用下面代码,只需要修改两个地方即可,见下:
在这里插入图片描述
在这里插入图片描述


import cv2
import numpy as np
import torch
import os
import sys

def pack_gbrg_raw(raw):                                               # 定义一个名为pack_gbrg_raw的函数,它接受一个参数raw,这个参数是一个GBRG格式的Bayer原始图像
    #pack GBRG Bayer raw to 4 channels
    black_level = 240                                                 # 定义黑色和白色的级别。这两个值用于后续的图像归一化。
    white_level = 2**12-1
    im = raw.astype(np.float32)                                       # 将输入的原始图像转换为浮点数类型
    im = np.maximum(im - black_level, 0) / (white_level-black_level)  # 对图像进行归一化处理,使其值在0到1之间

    im = np.expand_dims(im, axis=2)                                   # 在第三个维度(即通道维度)上为图像增加一个维度。
    img_shape = im.shape
    H = img_shape[0]                                                  # 获取图像的形状,并将高度和宽度分别存储在H和W中。
    W = img_shape[1]

    out = np.concatenate((im[1:H:2, 0:W:2, :],          # r           # 将图像的四个通道(R,Gr,B,Gb)沿着第三个维度(即通道维度)进行拼接。
                          im[1:H:2, 1:W:2, :],          # gr
                          im[0:H:2, 1:W:2, :],          # b
                          im[0:H:2, 0:W:2, :]), axis=2) # gb
    return out

def tensor2numpy(raw):  # raw: 1 * 4 * H * W
    input_full = raw.permute((0, 2, 3, 1))   # 1 * H * W * 4
    input_full = input_full.data.cpu().numpy()
    output = np.clip(input_full,0,1)
    return output

def preprocess(raw):
    input_full = raw.transpose((0, 3, 1, 2))
    input_full = torch.from_numpy(input_full)
    input_full = input_full.cuda()
    return input_full

img_path = "CRVD_dataset/indoor_raw_noisy/indoor_raw_noisy_scene7/scene7/ISO1600"                        # tiff格式图片路径
save_path = "CRVD_dataset/indoor_raw_noisy/indoor_raw_noisy_scene7/scene7/ISO1600_png"                   # 转换后的保存路径

file = os.listdir(path=img_path)

for item in file:
    img = cv2.imread(os.path.join(img_path,item),-1)

    img = np.expand_dims(pack_gbrg_raw(img), axis=0)

    isp = torch.load('isp/ISP_CNN.pth')
    test_gt = (img - 240) / (2 ** 12 - 1 - 240)                   # 计算地面真实图像的标准化值
    gt_raw_frame = test_gt * (2 ** 12 - 1 - 240) + 240            # 计算输出的最终值
    gt_srgb_frame = tensor2numpy(isp(preprocess(gt_raw_frame)))[0]   # 将预处理后的图像转换为sRGB格式

    img_png = np.uint8(gt_srgb_frame * 255)


    out_file = item[:-5] + ".png"
    print('图片{}转换为png成功!'.format(item))

    cv2.imwrite(os.path.join(save_path,out_file), img_png)

    key = cv2.waitKey(30) & 0xff
    if key == 27:
        sys.exit(0)

三、转换效果

3.1 转换测试场景1

在这里插入图片描述

3.2 转换测试场景2

在这里插入图片描述

3.3 转换测试场景3

在这里插入图片描述

3.4 转换测试场景4

该场景下,原始的.tiff图像就是噪声图。
在这里插入图片描述

3.5 转换测试场景5

在这里插入图片描述

3.6 批量转换效果

在这里插入图片描述

通过以上多场景测试,可以看到能够正常的转换回原始的色彩,图像细节都在。

四、总结

以上就是将.tiff格式图片转换为可视化的png,jpg,bmp等格式的完整过程,在我提供的示例代码中主要是将.tiff格式图片转为.png格式,学者如果想转为其它格式的图片,只需要在保存图片时修改后缀即可。

我上面测试的四个场景中,有的图片有噪声不是转换后才有的,是原始的.tiff格式就是噪声图,不用担心转换后改变原始图像细节。

总结不易,多多支持,谢谢!

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

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

相关文章

探索人工智能领域——每日20个名词详解【day7】

目录 前言 正文 总结 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Filotimo__✍️原创,首发于CSDN📚。 📣如需转载,请事先与我联系以…

YITH Product Countdown Premium电商商城产品倒计时高级版插件

点击阅读YITH Product Countdown Premium电商商城产品倒计时高级版插件原文 YITH Product Countdown Premium电商商城产品倒计时高级版插件的作用通过显示优惠的剩余时间或特定产品的可用数量的倒计时来促进销售。 您如何从中受益: 您可以利用稀缺性原则来增加转…

Open Inventor 2023.2.1 Crack

Fixed Bugs List 2023.2 2023.2.1 Open Inventor 2023.2.1 MeshViz #OIV-4824 Crash in MeshViz PbNonLinearDataMapping::computeColor Cache #OIV-4867 SoText3 : Texture read access violation – CAS-44904 Core #OIV-4725 Invalid displayed PoCircle color…

虹科案例 | OPC UA SDK快速扩展VIMANA智能制造软件连接性

导读: 虹科Matrikon在为OPC兼容性构建软件方面享有盛誉,VIMANA也因此选择使用我们的FLEX OPC UA SDK来快速扩展其智能制造软件的连接性,从而使用户能够“收听”其所有兼容OPC UA的设备,本篇案例文章将带你了解OPC UA SDK的现实应用…

《python每天一小段》--(2)使用Paramiko库,批量操作linux服务器

使用Paramiko库,批量操作多Linux服务器 使用Paramiko库建立SSH连接并执行命令获取多个Linux服务器的磁盘信息。通过这个例子,你可以学习到如何使用Python自动化操作远程服务器。 操作如图: 查看了两台服务器的磁盘容量: 安装模…

【电路笔记】-电阻器额定功率

电阻器额定功率 文章目录 电阻器额定功率1、概述2、电阻功率(P)3、功率电阻器4、电阻器额定功率示例15、电阻器额定功率示例2 电能被电阻吸收,因为它是电压和电流的乘积,一些电阻将这种电能转化为热量。 1、概述 当电流由于电阻器…

正则表达式(3):入门

正则表达式(3):入门 小结 本博文转载自 从这篇文章开始,我们将介绍怎样在Linux中使用”正则表达式”,如果你想要学习怎样在Linux中使用正则表达式,这些文章就是你所需要的。 在认识”正则表达式”之前&am…

【unity3D】unity中如何查找和获取游戏物体

💗 未来的游戏开发程序媛,现在的努力学习菜鸡 💦本专栏是我关于游戏开发的学习笔记 🈶本篇是unity中游戏物体的查找与获取 这里写自定义目录标题 获取当前物体的基本属性查找其它物体- 通过名称查找其它物体- 通过标签查找- 通过类…

微信开发者工具里面模拟操作返回、录屏、网络速度、截屏等操作

有时候可能因为自己开发的页面使用了自定义的样式,所以没有了左上角的导航返回,所以进入我自定义的页面后,想要返回的话,就可以用到这里面你的操作,或者想截屏了也可以直接使用里面的截屏,或者返回主页面等…

如何有效进行测试执行进度计划

测试执行通常都是处于软件测试生命周期的关键路径上,它不仅在测试过程中占有重要的地位,并且也会花费大量的测试时间。针对测试执行而进行的计划,即测试执行进度计划,是进行测试执行进度控制的基础。在进行测试执行进度计划制订的…

龙迅分配器LT86102UXE/LT86104UX,HDMI一分二/HDMI一分四

龙迅LT86102UXE描述; Lontium LT86102UXE HDMI2.0分配器具有1:2的分配器,符合HDMI2.0/1.4规范,最大6Gbps高速数据速率,自适应均衡RX输入和预先强调的TX输出,以支持长电缆应用程序,内部TX通道交换灵活的PCB…

C++进阶篇6---lambda表达式

目录 一、lambda表达式 1.引入 2、lambda表达式语法 二、包装器---function 1.引入 2.包装器介绍 三、bind 一、lambda表达式 1.引入 class Person { public:Person(int age,string name):_age(age),_name(name){} //private://方便后面的举例int _age;string _name…

全网最新最全的自动化测试教程:python+pytest接口自动化(9)-cookie绕过登录(保持登录状态

在编写接口自动化测试用例或其他脚本的过程中,经常会遇到需要绕过用户名/密码或验证码登录,去请求接口的情况,一是因为有时验证码会比较复杂,比如有些图形验证码,难以通过接口的方式去处理;再者&#xff0c…

【openssl】RSA 生成公钥私钥 |通过私钥获取公钥

通过博客:Window系统如何编译openssl 编译出openssl.exe(位于apps文件夹下)。 现在需要使用它获得公钥私钥、通过私钥获取公钥 目录 说明!!! 一.定位openssl.exe目录 二、进入命令cmd 三、生成私钥 …

知虾数据工具:助力Shopee商家实现数据化运营的有力助手

在如今竞争激烈的电商市场中,了解市场趋势、优化产品和店铺运营、了解竞争对手等是商家取得成功的关键。而针对Shopee平台的知虾数据工具则为商家和市场分析师提供了一个强大的数据分析工具。本文将介绍知虾数据工具的主要功能,包括多站点数据分析、行业…

抖音视频水印怎么去除?这三个视频去水印技巧值得收藏!

抖音视频水印怎么去除?随着互联网的持续发展,越来越多的人选择使用视频分享平台来展示他们的生活与工作。然而,上传到这些平台上的许多视频常常遭到恶意水印的攻击,严重影响了观众的观看体验。今天,我们将分享三个视频…

一键式紧急报警柱系统

随着科技的不断发展,一键式紧急报警柱在我们的生活和工作中扮演着越来越重要的角色。在这篇文章中,我们将一起探究与一键式紧急报警柱有关的知识。 一键式紧急报警柱是一种常见的安全防护设备,能够在紧急情况下快速发出警报,保护…

ChatGPT发布一年后,搜索引擎的日子还好吗?

导读:生成式AI,搜索引擎的终结者还是进化加速器 ChatGPT发布刚刚一年,互联网世界已经换了人间。 2023年,以ChatGPT和大模型为代表的生成式AI浪潮对全球互联网、云计算、人工智能领域都带来巨大冲击。而且生成式AI在各行各业的应用…

Oracle的数据一致性机制原理

一、前言 在单用户环境下,在操作数据库是不需要考虑其他用户会修改同一个数据。但是在多用户的情况下,多个事务可能会修改同一个数据,最终会得到错误的数据结果。 Oracle数据库是通过 multiversion consistency model(多版本数据…

HDFS客户端及API操作实验

实验二 HDFS客户端及API操作 实验目的: 1.掌握HDFS的客户端操作,包括上传文件、下载文件、重命名、查看目录等; 2.掌握HDFS的Java API使用,能够利用Java API实现上传、下载等常用操作; 实验内容: HDF…