最终代码链接附在最后,但我想先详细介绍一下TIFF(或者tif)转jpg,转换的问题和难点在哪里?

1. tif可以有8位,24位,32位甚至更高,又分为有符号,无符号等,对于学遥感和GIS的来说,接触到的tif影像往往是高像素深度的,tif影像中的灰度值可以是几千几万。但jpg,一般是8位,rgb都是0到255取值,所以tif到jpg,意味着色彩的压缩。

2. tif可以是多波段的,例如高分一号影像就有红绿蓝近红外四个波段,而jpg只有RGB三个颜色通道,tif转jpg意味着波段信息的丢失

一些人会觉得使用工具将tif直接转成jpg是件容易的事情,我们来看一下效果:

原始影像在ArcGIS中打开是左边的样子,中间则是用的ArcGIS工具箱中的工具转的(工具叫做:栅格转其他格式,注意转之前可能需要改变像素深度,降低到8位,不然那个工具会提示转换失败)。可以看到,直接转格式的效果并不好,图像变灰了。

我当时认为是arcgis在直接转jpg的时候,压缩了导致了,所以我决定自己写代码转,思路如下:使用gdal C# 版的读取每个像元值,找到最大和最小值,然后新建bitmap,将最大值变为255,最小值变为0,中间则是线性拉伸的,函数关系式应该是这样的:

得到的jpg是上边右边那幅图,说明自己写代码线性拉伸得到的jpg也会色彩失真。

重点来了:

仔细理解一下,其实,这些图片都包含了相同或相似的灰度信息和色彩信息,我们看到的颜色不同和色彩失真的情况,只是图像显示的方式不一样罢了。我们的电脑屏幕支持rgb,为什么我们转出来的jpg和在电脑上用arcgis打开看到的不一样,如果你只用转少量的格式,完全可以截图。但要实现批量和自动化,则需要写代码了。

以arcgis为例,打开属性的符号系统:

这下,应该明白了,arcgis在显示影像的时候,实际上不是单纯的将影像线性拉伸到0-255范围,而是采用了一定的方法,包括百分比截断,直方图均衡化,最值等等方式。

以百分比截断为例,就是设置两个百分比阈值,比如图中最小值0.5,最大值0.5,意思是说,在直方图中(如下图),前0.5%范围内的像元值变成0,后0.5%范围内的像元值变成255,中间的像元值则还是线性拉伸。

比如红色波段的直方图中,最小是89,最大是507,假如有10000个像元,那么,前10000x0.5%=50个像元拉伸为0,后50拉伸为255。这里的前50和后50指的是直方图中的个数,比如89的有10个,90的有20个,91的有25个,那么,所有像元值为89,90,91的像素,在jpg中相应的位置都赋值为0。网上也有一些关于百分比截断的说明,我看都不详细,有的还有错误。

最后,附上我自己写代码实现的tif转jpg的成果,拉伸方式采用的是百分比截断,还是C#结合GDAL读取影像,然后使用bitmap绘制保存。

但有个问题就是图像的宽度和高度发生了变化,不知道是什么原因,正在探究...

我把代码也上传了,点下面的链接下载。

C#将tif影像转成jpg方法(显示保持颜色不变,类似于直接在arcgis中截图)

更新:

经过自己的探索,又发现各种效果更好的方法:

1.可以使用arcpy,调用ExportToJPEG方法将影响导出成jpg图片,其实际就类似于ArcGIS中导出地图,ExportToJPEG经常用于使用arcpy批量制图,用在这里也是可以的,ExportToJPEG方法可以参考官方帮助文档:ExportToJPEG—帮助 | ArcGIS for Desktop

2.使用GDAL,GDAL有个gdal.Translate函数,这个函数的功能很强大,但网上关于传入参数的说明较少,这个是可以通过控制参数达到很好的转换质量的,也是我推荐的方案。

3. 使用ENVI的Stretch Data工具

2020更新

下面附上我写的python代码:

# -*- coding: UTF-8 -*-
import numpy as np
import os
import sys
from PIL import Image
from osgeo import gdal, gdalconst

如果使用的是多光谱影像,首先需要读取其中的三个波段,分别对应RGB:

#读取tif
'''bandsOrder为RGB对应的波段顺序,
例如高分一号多光谱包含蓝,绿,红,近红外四个波段,
那么真彩色对应的波段顺序为3,2,1'''def readTif(original,bandsOrder=[3,2,1]):driver = gdal.GetDriverByName('GTiff')driver.Register()ds = gdal.Open(original, gdal.GA_ReadOnly)cols = ds.RasterXSizerows = ds.RasterYSizegeotransform = ds.GetGeoTransform()proj = ds.GetProjection()data=np.empty([rows,cols,3],dtype = float)for i in range(3):band=ds.GetRasterBand(bandsOrder[i])data1 = band.ReadAsArray()data[:,:,i]=data1return data

然后进行拉伸,这里以百分比截断为例:

#百分比拉伸
def stretchImg(imgPath, resultPath, lower_percent=0.6, higher_percent=99.4):data=readTif(imgPath)n = data.shape[2]out = np.zeros_like(data, dtype=np.uint8)for i in range(n):a = 0b = 255c = np.percentile(data[:, :,i], lower_percent)d = np.percentile(data[:, :,i], higher_percent)t = a + (data[:, :,i] - c) * (b - a) / (d - c)t[t < a] = at[t > b] = bout[:, :,i] = toutImg=Image.fromarray(np.uint8(out))outImg.save(resultPath)

深入探究:TIFF格式的影像如何转jpg (保持色彩不变)相关推荐

  1. Sentinel-2影像jp2格式转tiff格式(C++\Python)

    Sentinel-2影像jp2格式转tiff格式 1.打开Sentinel-2影像 2.获取投影信息和仿射变换6参数 3.获取影像宽.高和波段数. 4.创建tiff格式数据驱动 5.读取数据 6.写入 ...

  2. Matlab读写TIFF格式文件

    1.简介 通常情况下,使用MATLAB做图像处理后,使用下面的命令就可以保存处理结果为图片. imwrite(im,'im.bmp'); 而如果需要保存的图像为single或者double类型,或保存 ...

  3. 转Matlab读写TIFF格式文件

    1.简介 通常情况下,使用MATLAB做图像处理后,使用下面的命令就可以保存处理结果为图片. imwrite(im,'im.bmp'); 而如果需要保存的图像为single或者double类型,或保存 ...

  4. Matlab写TIFF格式文件(多于3波段)

    1.起因 通常情况下,使用MATLAB做图像处理后,使用下面的命令就可以保存处理结果为图片. imwrite(im,'im.bmp'); 而如果需要保存的图像为single或者double类型,或保存 ...

  5. python matplotlib模块画出的图像转换为.tiff格式

    利用python matplotlib模块(python3.7.1)画出的图表暂不支持直接导出.tiff格式的图片,但是可以导出eps, pdf, pgf, png, ps, raw, rgba, s ...

  6. 用JAI实现对TIF(TIFF)格式图片的合并

    用JAI实现对TIF(TIFF)格式图片的合并 方法一: import java.io.File; import java.io.FileOutputStream; import java.io.IO ...

  7. 请问asp.net网页里能显示tiff格式的图片吗?

    我做的存取图片的程序,其它格式的图片都可以显示,可tiff格式的图片总是显示乱码,哪位高手给指点指点是怎么回事?谢谢! 转载于:https://www.cnblogs.com/support/arch ...

  8. JPEG/Exif/TIFF格式解读(1):JEPG图片压缩与存储原理分析

    JPEG文件简介 JPEG的全称是JointPhotographicExpertsGroup(联合图像专家小组),它是一种常用的图像存储格式, jpg/jpeg是24位的图像文件格式,也是一种高效率的 ...

  9. matlab tif dpi,轻松解决杂志要求的300dpi分辨率、TIFF格式图片

    不过这样只能打印出pdf格式,那么有些杂志需要"TIFF格式"或"JPEG"格式怎么办呢? 先运行**版的"Adobe Acrobat Pro&quo ...

  10. arcmap给tif添加地理坐标_如何将JPG格式的图片转化为带地理坐标的TIFF格式

    最近有个项目需要用到开源软件GeoServer,数据源是一张高分辨率的2.5维图片,格式是jpg的,由于GeoServer不支持jpg格式的发布,因此考虑到要进行格式转换,将其转换成tiff格式. 1 ...

最新文章

  1. 重磅!NVIDIA开源C++标准库:Libcu++
  2. MVC系列——一个异常消息传递引发的思考
  3. linux 搭建 lamp环境搭建,Worktile官方博客,分享企业协作的技巧、工具和实践
  4. Table of Contents - Tomcat
  5. CEPH给用户创建读写权限
  6. jsp button提交表单
  7. js window.open()实现打印,如何在关闭打印窗口时刷新父窗口
  8. php环境搭建5.6_WIN8.1下搭建PHP5.6环境
  9. 敏而好学,不耻下问。
  10. pcm 采样率转换_高速模数转换器 ADC 树立了实时监测和控制的标准
  11. php 重写sessionid,PHP 重置 phpsessionid
  12. Linux系统安装pgp教程,在Linux系统下安装pgpcommandline
  13. 最全面的SpringMVC教程(二)——SpringMVC核心技术篇
  14. mysql 1236错误_MySQL 1236错误解决方法_MySQL
  15. 使用libusb读取鼠标数据
  16. 隐马尔科夫(HMM)模型
  17. C++typedef的用法
  18. 基于Matlab的二阶电路的动态电路分析!
  19. FPGA 20个例程篇:18.SD卡存放音频WAV播放(中)
  20. Apollo星火计划学习笔记——Apollo路径规划算法原理与实践

热门文章

  1. 知识服务才是为用户创造价值的体现
  2. 四,AXI总线协议解析
  3. java实战我爱自学网,白银java教程我要自学网
  4. 数学分析笔记4:一元函数微分学
  5. 按键精灵自动过QQ滑块脚本 ,速度最快的源码库存!
  6. 先天八卦与后天八卦原理及区别
  7. 神秘消失的Windows 9,如今真被人做出来了
  8. html阅读模式怎么进入word模式,word阅读模式怎么取消
  9. html网页如何添加google广告,三步将谷歌广告代码添加到WordPress网站侧边栏 | 老豆国外联盟营销教程指南...
  10. BetterZip 4.2.4 激活版下载安装– Mac上最快速的压缩工具