大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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)
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/192504.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...