将图像转换为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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • navicat激活码linux[最新免费获取]

    (navicat激活码linux)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月31日
    71
  • python 多线程就这么简单

    python 多线程就这么简单理解python的多线程如此简单

    2022年7月3日
    157
  • Java中,为什么byte类型的取值范围为-128~127?

    Java中,为什么byte类型的取值范围为-128~127?在学习Java基础语法的时候,初学者的我们可能都会有这么一个疑问为什么byte类型的取值范围为什么是[-128,127]而不是[-127,127]。01111111表示最大的数值:127,因为第一位是符号位,所以11111111应该是最小的数值:-127,不是这样才对?在解释这个问题之前我们需要了解几个概念:机器数、真值、原码、反码、补码机器数:一个数在计算机中的二进制表示形式,叫做这个数的机器

    2022年6月15日
    23
  • 电脑上怎么看用户名和密码_电脑超级用户名和密码

    电脑上怎么看用户名和密码_电脑超级用户名和密码大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。以windows7为例,电脑的用户名和密码的查看方法是:1、找到“我的电脑”或计算机;2、单击鼠标右键,打开“管理”;3、点击“本地用户和组”;4、选择用户,单击打开;5、查看用户及密码,也可以开机启动Windows,当运行到“正在启动WindowsXP”的提示界面时,按“F8”键调出系统启动选择菜单,选择“带命令行安全模式”;…

    2022年10月11日
    0
  • docker安装Redis_docker redis配置文件路径

    docker安装Redis_docker redis配置文件路径1、获取redis镜像dockerpullredis

    2025年6月27日
    0
  • django修改数据_winform增删改查

    django修改数据_winform增删改查前言在ORM框架中,所有模型相关的操作,比如添加/删除等。其实都是映射到数据库中一条数据的操作。因此模型操作也就是数据库表中数据的操作。添加一个模型到数据库中:添加模型到数据库中。首先需要创建一

    2022年7月31日
    3

发表回复

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

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