问题遇到的现象和发生背景
使用arcgis栅格分割功能,分割出的图像栅格无法吻合。以下是使用python代码分割的结果:
**红色部分并没有裁剪出,而且看样子,这部分的栅格行列号与裁剪出的行列号应该并不相同。
**
问题相关代码,请勿粘贴截图
# -*- coding: utf-8 -*-
import os
import numpy
from osgeo import gdal
class GRID:
# 读图像文件
def read_img(self, filename):
dataset = gdal.Open(filename) # 打开文件
im_width = dataset.RasterXSize # 栅格矩阵的列数
im_height = dataset.RasterYSize # 栅格矩阵的行数
im_geotrans = dataset.GetGeoTransform() # 仿射矩阵
im_proj = dataset.GetProjection() # 地图投影信息
im_data = dataset.ReadAsArray(0, 0, im_width, im_height) # 将数据写成数组,对应栅格矩阵
del dataset
return im_proj, im_geotrans, im_data
# 写文件,以写成tif为例
def write_img(self, filename, im_proj, origin_x, origin_y, pixel_width, pixel_height, im_data):
# gdal数据类型包括
# gdal.GDT_Byte,
# gdal .GDT_UInt16, gdal.GDT_Int16, gdal.GDT_UInt32, gdal.GDT_Int32,
# gdal.GDT_Float32, gdal.GDT_Float64
# 判断栅格数据的数据类型
if 'int8' in im_data.dtype.name:
datatype = gdal.GDT_Byte
elif 'int16' in im_data.dtype.name:
datatype = gdal.GDT_UInt16
else:
datatype = gdal.GDT_Float32
# 判读数组维数
if len(im_data.shape) == 3:
im_bands, im_height, im_width = im_data.shape
else:
im_bands, (im_height, im_width) = 1, im_data.shape
# 创建文件
driver = gdal.GetDriverByName("GTiff") # 数据类型必须有,因为要计算需要多大内存空间
dataset = driver.Create(filename, im_width, im_height, im_bands, datatype)
dataset.SetGeoTransform((origin_x, pixel_width, 0, origin_y, 0, pixel_height)) # 写入仿射变换参数
dataset.SetProjection(im_proj) # 写入投影
if im_bands == 1:
dataset.GetRasterBand(1).WriteArray(im_data) # 写入数组数据
else:
for i in range(im_bands):
dataset.GetRasterBand(i + 1).WriteArray(im_data[i])
del dataset
# 计算某行列下像元经纬度
def calcLonLat(dataset, x, y):
minx, xres, xskew, maxy, yskew, yres = dataset.GetGeoTransform()
lon = minx + xres * x
lat = maxy +xres * y
return lon, lat
if __name__ == "__main__":
# os.chdir(r'D:/Personality/paper/GBDT/testshiyan') # 切换路径到待处理图像所在文件夹
file_name = r"D:/Personality/paper/GBDT/label/dilei.tif"
dataset = gdal.Open(file_name)
minx, xres, xskew, maxy, yskew, yres = dataset.GetGeoTransform()
proj, geotrans, data = GRID().read_img(file_name) # 读数据
print(proj)
print(geotrans)
print(data.shape)
width, height = data.shape
size = 41
saze = 37
for j in range(height // size): # 切割成256*256小图
for i in range(width // saze):
if(j==height//saze):
cur_image = data[i * saze:(i + 1) * saze, j * size:(j + 1) * size]
lon = minx + xres * size * j
lat = maxy + yres * (i * saze)
GRID().write_img(r'D:/Personality/paper/GBDT/testshiyan/{}_{}.tif'.format(i, j), proj,
lon, lat, xres, yres, cur_image) ##写数据
else:
cur_image = data[i*saze:(i + 1) * saze, j * size:(j + 1) * size]
lon=minx+xres*size*j
lat=maxy+yres*(i*saze)
GRID().write_img(r'D:/Personality/paper/GBDT/testshiyan/{}_{}.tif'.format(i, j), proj,
lon, lat, xres, yres, cur_image) ##写数据
运行结果及报错内容
代码没问题,正常运行。但得到的结果不理想。
我的解答思路和尝试过的方法
我想要达到的结果
我想要得到均匀分割的图像,分割出的tif具有相同的行列号。并且行列号加起来是原图像的行列号。