首先,对于多波段影像里面有很多信息(包括仿射变换、投影信息),因此首先要读取TIF数据。
其中里面包含根据仿射矩阵获取地理坐标信息等代码。
def readTif(fileName, xoff=0, yoff=0, data_width=0, data_height=0):
'''
读取tif影像数据
'''
dataset = gdal.Open(fileName)
if dataset == None:
print(fileName + "文件无法打开")
# 栅格矩阵的列数
width = dataset.RasterXSize
# 栅格矩阵的行数
height = dataset.RasterYSize
# 波段数
bands = dataset.RasterCount
# 获取数据
if(data_width == 0 and data_height == 0):
data_width = width
data_height = height
data = dataset.ReadAsArray(xoff, yoff, data_width, data_height) # np.array
# print(type(data))
# 获取仿射矩阵信息
geotrans = dataset.GetGeoTransform()
# 获取投影信息
proj = dataset.GetProjection()
arrXY = [] # 用于存储每个像素的(x,y)坐标
for i in range(height):
row = []
for j in range(width):
xx = geotrans[0] + i * geotrans[1] + j * geotrans[2]
yy = geotrans[3] + i * geotrans[4] + j * geotrans[5]
col = [xx, yy]
row.append(col)
arrXY.append(row)
return width, height, bands, data, geotrans, proj, arrXY
接下来,是根据上述读取TIF的data作为基础,因为data是numpy.array,CHW格式数据,就可以根据三维数组思想将TIF格式转为JPG(PNG)。
def tif_to_jpg(src_tifs):
'''tif转为jpg显示'''
for src_tif in src_tifs:
pre_img = readTif(src_tif)[3]
# print('xxyy.type', type(xxyy))
pre_img_one = pre_img[4, :, :]#R通道
pre_img_two = pre_img[6, :, :]#G通道
pre_img_three = pre_img[1, :, :]#B通道
# height, width = pre_img.shape[1:]
new_array = np.array([pre_img_one, pre_img_two, pre_img_three])#重新将三个通道组成为数组
new_array = np.transpose(new_array, (1, 2, 0))#将CHW转为HWC
img = Image.fromarray(np.uint8(new_array))#数组转为图片所用的函数
dir, file_name1 = os.path.split(src_tif) # split将文件和路径分开
(prename, suffix) = os.path.splitext(
file_name1) # splitext将文件名和后缀分开
dst_jpg_path = r'F:\tif_to_rgb'
dst_jpg = os.path.join(dst_jpg_path, prename+'.jpg')#改为png即可
print(dst_jpg, img.shape)
img.save(dst_jpg)
|