大家好,又见面了,我是你们的朋友全栈君。
一 背景
遥感图像一般像素深度比较高,基本的就是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图片
代码语言:javascript复制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.cn/192504.html原文链接:https://javaforall.cn