【技巧】pytorch tif转成jpg

目录

tif转成jpg文件

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

原理

重点

代码

在cmd下批量转换图片格式


tif转成jpg文件

https://blog.csdn.net/HJ850126/article/details/9319855

string address="E:\\1.tif";//tif文件物理路径  

System.IO.FileStream stream = System.IO.File.OpenRead(address);
                        Bitmap bmp = new Bitmap(stream);
                        System.Drawing.Image image = bmp;//得到原图
                        //创建指定大小的图 
                        System.Drawing.Image newImage = image.GetThumbnailImage(424, 600, null, new IntPtr());
                        Graphics g = Graphics.FromImage(newImage);
                        g.DrawImage(newImage, 0, 0, newImage.Width, newImage.Height);
                        //将原图画到指定的图上
                        g.Dispose();
                        stream.Close();
                        newImage.Save(Server.MapPath(".") + "\\showFax.jpg", ImageFormat.Jpeg); //这里必须是物理路径

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

https://blog.csdn.net/tuoyakan9097/article/details/81261675

原理

        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绘制保存。

代码

# -*- 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.RasterXSize
    rows = ds.RasterYSize
    geotransform = 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]=data1
    return 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 = 0
        b = 255
        c = 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] = a
        t[t > b] = b
        out[:, :,i] = t
    outImg=Image.fromarray(np.uint8(out))
    outImg.save(resultPath)

在cmd下批量转换图片格式

https://blog.csdn.net/uilldo/article/details/86109679

1.打开cmd,进入到需要修改的图片所在的文件夹

2.用dir命令查看该目录下的文件
在这里插入图片描述

3. 将png格式图片批量转为jpg格式

#将所有png格式图片转为jpg格式
ren *.png *.jpg

4.用dir查看,发现所有都转化成功

不单是png转JPG,JPG转png,以及png转gif等都可以哦

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值