将图像转换为8位通道_imagej像素和毫米转换

将图像转换为8位通道_imagej像素和毫米转换一背景遥感图像一般像素深度比较高,基本的就是unit16了,但是如果想在OpenCV中正确使用,而且不丢失数据RGB三通道信息,就需要转为unit8才能进行其他分析。二分析unit16的图像最大值为216-1=65535,而OpenCV中的图像最大值为28-1=255,当大于255时会自动变为255,这样数据信息就丢失了。下面代码采用的方式是线性缩放,将0到65535的数值线性缩…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一 背景

遥感图像一般像素深度比较高,基本的就是unit16了,但是如果想在OpenCV中正确使用,而且不丢失数据RGB三通道信息,就需要转为unit8才能进行其他分析。

二 分析

unit16的图像最大值为216-1 = 65535,而OpenCV中的图像最大值为28-1 = 255,当大于255时会自动变为255,这样数据信息就丢失了。下面代码采用的方式是线性缩放,将0到65535的数值线性缩放到0到255

三 代码

说明:代码使用了OpenCV和gdal函数包,gdal用来读取.tif文件unit16图片,OpenCV用来重新生成unit8图片


import os
import gdal
from cv2 import cv2
import numpy as np
import sys
#拉伸图像 #图片的16位转8位
def uint16to8(bands, lower_percent=0.001, higher_percent=99.999): 
    out = np.zeros_like(bands,dtype = np.uint8)
    n = bands.shape[0] 
    for i in range(n): 
        a = 0 # np.min(band) 
        b = 255 # np.max(band) 
        c = np.percentile(bands[i, :, :], lower_percent) 
        d = np.percentile(bands[i, :, :], higher_percent) 
        t = a + (bands[i, :, :] - c) * (b - a) / (d - c) 
        t[t<a] = a
        t[t>b] = b
        out[i, :, :] = t 
    return out 
    
path = sys.path[0] #获取当前代码路径
tif_list = [x for x in os.listdir(path) if x.endswith(".tif")]
for num, i in enumerate(tif_list):
    print(path+'\\'+i)
    dataset = gdal.Open(path+'\\'+i)
    width = dataset.RasterXSize                         # 获取数据宽度
    height = dataset.RasterYSize                        # 获取数据高度
    outbandsize = dataset.RasterCount                   # 获取数据波段数
    im_geotrans = dataset.GetGeoTransform()             # 获取仿射矩阵信息
    im_proj = dataset.GetProjection()                   # 获取投影信息
    datatype = dataset.GetRasterBand(1).DataType
    im_data = dataset.ReadAsArray()                     #获取数据 
    # print(im_data.shape)
    img3 = uint16to8(im_data)
    img2 = img3[0:3,:,:]
    img2 = np.transpose(img2,(1,2,0))
    out = img2[:,:,::-1] #rgb->bgr
    cv2.imwrite(path+'\\'+i, out)
    print(num)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/192504.html原文链接:https://javaforall.net

(0)
上一篇 2025年12月13日 下午8:15
下一篇 2025年12月13日 下午8:43


相关推荐

  • Tle格式

    Tle格式TLE 格式 nbsp CelesTrak 提供

    2026年3月20日
    2
  • .net cms开源_基于vue的开源CMS

    .net cms开源_基于vue的开源CMS提起开源cms,大家第一想到的是php的cms,因为php开源的最早,也最为用户和站长们认可,随着各大cms系统的功能的不断完善和各式各样的开源cms的出现,.net和java的高端的cms系统也逐渐的走上了开源的路线,尤其是.net的cms系统,从最早国外的开源,到现在国内致力于.net的cms系统的研发的公司和团队也渐渐认清楚开源路线的必然性,于是乎竞相的提出开源战略路线,但有的还是并不是全

    2026年4月14日
    6
  • 宽字节注入原理分析[通俗易懂]

    宽字节注入原理分析[通俗易懂]什么是宽字节?如果一个字符的大小是一个字节的,称为窄字节;如果一个字符的大小是两个字节的,成为宽字节。像GB2312、GBK、GB18030、BIG5、Shift_JIS等这些编码都是常说的宽字节,也就是只有两字节英文默认占一个字节,中文占两个字节什么是宽字节注入?原理:宽字节注入是利用了mysql的一个特性,即mysql在使用GBK编码时,在url解码时会认为两个字符是一个汉字(前一个ASCII码要大于128,才表示到汉字的范围)通常情况下,一个utf-8编码的汉子占用3个字节,一个GBK编

    2022年10月15日
    4
  • java定时器配置_java定时器实现如何配置?「建议收藏」

    java定时器配置_java定时器实现如何配置?「建议收藏」定时器在一些时候会起到不可忽视的作用,本篇文章我们就来通过一些例子详细了解一下定时器的实现。例1:importjava.util.TimerTask;publicclassTimeTastextendsTimerTask…{//在这里写你要定时执行的方法publicvoidrun()…System.out.println(“HelloWorld!”);}}importj…

    2026年1月15日
    5
  • 关于tempdb的一些注意事项

    关于tempdb的一些注意事项

    2021年11月25日
    46
  • 计算两个向量的夹角

    计算两个向量的夹角计算两个向量的夹角 doublegetRot doublex1 doubley1 doublex2 doubley2 constdoublee 1 0e 6 constdoublen acos 1 0 doubledist dot degree angle normalizedis sqrt x

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号