Matlab 读取—处理—保存遥感影像(带有地理信息的图像)

本文详细介绍如何使用Matlab的geotiffread和geotiffwrite函数读取、裁剪和保存带有地理信息的遥感影像。通过示例代码展示了如何设定经纬度范围进行精确裁剪,并更新地理坐标信息。
Start_Latitude = 0.6;

End_Latitude = 0.8;

Start_Lontitude = 0.1;

End_Lontitude = 0.3;

Matlab读取遥感影像的函数是:geotiffread(针对的是tif数据文件)

一、简介

1)数据读取 

[A,R] = geotiffread(filename) ;

Reads a georeferenced grayscale, RGB, or multispectral image or data grid from the GeoTIFF file specified by filename into A and creates a spatial referencing object, R.(官方解释)。

描述一下就是 代表的数据文件(高程之类的数据),为空间坐标信息(包括数据的大小,经纬度范围与起始经纬度,数据单位、方向等)。

读取部分到此为止!

2)数据处理

我这里主要介绍的数据的裁剪(比如要从一块数中选择其中的某一部分画图等)。

我们应该很清楚在做数据裁剪时会用到Matlab的冒号(:)函数,这个也是很简单。但是我们在对含有地理坐标的数据进行裁剪时,经纬度信息也要对应数据裁剪的办法进行裁剪。

Start_Latitude = 0.6;

End_Latitude = 0.8;

Start_Lontitude = 0.1;

End_Lontitude = 0.3;

以上四个部分是裁剪的核心部分,只要修改对应的这四个值就可以选择裁剪对应的数据区域。比如在一个10*10的矩阵中,上面的四个数字0.60.8 0.10.3对应的区域如图1中的绿色区域

       

                                                                                     图1 示例图

3)数据保存

geotiffwrite(filename,A,R) writes a georeferenced image or data grid, A, spatially referenced by R, into an output file, filename.

操作与读取类似,不再赘述!

二、例子

                                                                                        图2 原始数据

 

                                                   

                                                                             图3 原始数据地理坐标信息

 

                                               

                                                                            图4 截取之后的地理坐标信息

1Code

function Geographic_RPW()
tic %Record the running time
%% Read file
[Data,R] = geotiffread('D:\20181102\优快云-博文\Matlab处理地理数据\ndvi2.tif');
%% Select interception position
Start_Latitude = 0.6;
End_Latitude = 0.8;
Start_Lontitude = 0.1;
End_Lontitude = 0.3;
%需要补充一下此四个数的意义

%% cuttiing into certain shape
Posion = [Start_Latitude,End_Latitude;Start_Lontitude,End_Lontitude];
[row, col] = size(Data);
first_row = floor(Posion(1,1)*row)+1;%起始维度(加1为了避免first_row=0,使用ceil函数可以不用加1)
last_row = floor(Posion(1,2)*row);%结束维度
first_col = floor(Posion(2,1)*col)+1;%起始经度(加1为了避免first_row=0,使用ceil函数可以不用加1)
last_col = floor(Posion(2,2)*col);%结束经度
subImage = Data(first_row:last_row, first_col:last_col);%数据截取

%% Set GeographicCells Reference parameters
%文件的地理坐标信息还有样本大小信息同样也是需要截取的和更新的,截取的基本理论类似与数据的截取办法。
% mainly set the range of latitude and lontitude
subR = R;%原始数据的地理坐标信息和数据大小等信息。
subR.RasterSize = size(subImage);%跟新截取后的数据大小信息
del_La = subR.LatitudeLimits(2) - subR.LatitudeLimits(1);% the scale of latitude(纬度的最大值减去最小值)
del_Lon = subR.LongitudeLimits(2) - subR.LongitudeLimits(1);% the scale of lontitude(经度的最大值减去最小值)
subR.LatitudeLimits = [subR.LatitudeLimits(1)+Posion(1,1)*del_La,...
    subR.LatitudeLimits(2) - del_La*(1 - Posion(1,2))];%截取位置的维度范围
subR.LongitudeLimits = [subR.LongitudeLimits(1)+Posion(2,1)*del_Lon,...
    subR.LongitudeLimits(2) - del_Lon*(1 - Posion(2,2))];%截取位置的经度范围

%% Data processing
%一些最基本的数据处理,在此要根据数据的性质(大小与分布规律看一下)
%在matlab调试中看一下截取后的数据的值,下面这个处理过程只是针对我
%所要解决的一个问题。
[row,col] = size(subImage);
for i = 1:row
   for j = 1:col
      if subImage(i,j)<0
          subImage(i,j) = 0;
      elseif subImage(i,j)>0
          subImage(i,j) = 1;
      end
   end
end

for i = floor(0.45*row):floor(0.8*row)
   for j = floor(0.14*col):floor(0.5*col)
      if subImage(i,j)<=0
          subImage(i,j) = 0;
      elseif subImage(i,j)>0
          subImage(i,j) = 2;
      end
   end
end
%% Preview the interception posion
figure(1);
imshow(subImage);%黑白图
figure(2);
imagesc(subImage);%彩色图

%% Writiing the data to a new GEOTIFF file
filename = 'C:\Users\Administrator\Desktop\ndvi-new.tif';
geotiffwrite(filename,subImage,subR);%保存文件
toc%Recording the time when the program end running
%% Writed By themingyi
%2018/12/05

2)处理结果

                   

 

                                                                                             图5 imshow展示结果

 

                       

                                                                                             图6 imagesc 展示结果

 

                                

                                                                                          图7 AI修改后的最终结果

 

PS:本程序以及所有使用的数据已经放到百度云供下载:

链接:https://pan.baidu.com/s/1o2vC_1QKyWmwvW8-g-E09Q 
提取码:s97g 
欢迎讨论指正,本人e-mail:themingyi123@gmail.com

 

参考:

1、https://www.mathworks.com/help/map/ref/geotiffread.html

2、https://blog.youkuaiyun.com/liyanzhong/article/details/52850581

Matlab读取带有地理信息的图像

3、http://www.ilovematlab.cn/forum.php?mod=viewthread&tid=213403

MATLAB 遥感影像的读写操作,带地理坐标信息

4、https://blog.youkuaiyun.com/qq_26906835/article/details/80841823

Matlab(一):二维矩阵转换为geoTiff

5、http://www.mathworks.com/help/map/ref/geotiffwrite.html

 

 

<think>好的,我现在需要帮助用户了解如何在Matlab处理TIFF文件,包括读取、写入和操作。首先,我得回忆一下相关的Matlab函数和步骤。根据用户提供的引用内容,引用了四个来源,其中提到geotiffread、geotiffinfo、imread、imwrite等函数。我需要确保这些信息准确,并按照用户的要求结构化回答。 首先,用户的问题是关于读取、写入和操作TIFF文件。根据引用[3],标准的MATLAB I/O命令如load和save不能用于图形文件,因此必须使用专门的图像处理函数。引用[4]提到geotiffread、geotiffinfo和readraster,这些可能用于地理空间TIFF文件。而引用[1]提到处理multi-tiff图像,即多页TIFF,可能需要不同的方法,比如循环读取每一页。 接下来,我需要整理读取TIFF的步骤。使用imread函数读取普通TIFF,如果是多页的,可以用循环配合imread的'Index'参数。对于地理空间TIFF,geotiffread可以同时获取图像数据和地理信息。例如,[X, R] = geotiffread('file.tif'),其中R是空间参考信息。这来自引用[4]。 写入部分,imwrite函数可以保存为TIFF,设置'Compression'等参数。对于多页TIFF,需要在循环中使用imwrite,并设置'WriteMode'为'append'。引用[2]提到dlmwrite保存数据为文本,但这里可能不相关,重点在imwrite和geotiffwrite。地理空间TIFF的写入可能需要geotiffwrite函数,需要空间参考信息,如引用[4]所述。 操作部分包括调整大小、增强、提取波段等。使用imresize、imadjust、图像索引操作等。例如,多光谱图像可以用(:,:,n)来提取第n个波段。此外,处理三维数据(如多页TIFF)时,可能需要将图像堆叠成三维矩阵,如引用[1]中的multipage-tiff-stack处理。 注意事项方面,数据类型很重要,比如uint8和double的转换。地理空间TIFF需要额外处理地理信息,不能直接用imwrite,而要用geotiffwrite,如引用[4]所述。 然后需要生成相关问题,可能涉及多页处理地理信息、性能优化等,根据引用内容中的信息来提问。例如,如何读取多页TIFF,如何处理地理标签,优化大文件处理等。 现在,我需要确保回答结构清晰,分步骤说明,正确引用来源。例如,在读取部分引用[3]和[4],写入部分引用[4]和[2],操作部分引用[1]和[3]。同时,添加相关问题,如用户示例中的那样,基于提到的函数和应用场景来提问。 需要检查是否有遗漏的细节,比如多页TIFF的处理方法是否正确,地理空间函数的使用是否准确,以及注意事项中的数据转换和性能问题。此外,确保所有LaTeX格式正确,但根据用户指令,问题中没有数学表达式,可能不需要使用,但示例中的代码块需要用正确的格式。 最后,确保回答使用中文,引用标识正确放置在对应的步骤末尾,如使用imread时引用[3],geotiffread时引用[4],保存地理TIFF时引用[4]等。生成的问题要相关,覆盖用户可能感兴趣的方面,如性能优化、应用场景、与其他格式对比等。</think>### 使用Matlab处理TIFF文件的步骤说明 #### 1. **读取TIFF文件** - **普通TIFF文件** 使用`imread`函数直接读取单页或多页TIFF文件。例如: ```matlab image_data = imread('example.tif'); ``` 对于多页TIFF(如三维图像堆叠),需循环读取每一页: ```matlab info = imfinfo('example.tif'); num_pages = numel(info); for i = 1:num_pages image_stack(:,:,i) = imread('example.tif', 'Index', i); end ``` 引用[^3]指出,图像文件格式需通过专用函数(如`imread`)而非标准I/O命令读取。 - **地理空间TIFF(GeoTIFF)** 使用`geotiffread`函数读取带地理坐标信息的数据: ```matlab [X, R] = geotiffread('geo_image.tif'); % X为图像数据,R为空间参考信息 ``` 引用[^4]说明,`geotiffread`可同时获取图像和地理元数据。 #### 2. **写入TIFF文件** - **普通TIFF文件** 使用`imwrite`保存图像,通过参数控制压缩格式(如LZW): ```matlab imwrite(image_data, 'output.tif', 'Compression', 'lzw'); ``` 多页TIFF需逐页追加: ```matlab for i = 1:size(image_stack,3) if i == 1 imwrite(image_stack(:,:,i), 'output_stack.tif', 'WriteMode', 'overwrite'); else imwrite(image_stack(:,:,i), 'output_stack.tif', 'WriteMode', 'append'); end end ``` - **地理空间TIFF(GeoTIFF)** 使用`geotiffwrite`保存地理信息的TIFF,需提供空间参考对象(如`R`): ```matlab geotiffwrite('geo_output.tif', X, R); ``` 引用强调,地理信息需通过`geotiffinfo`或自定义参考对象传递。 #### 3. **操作TIFF数据** - **图像增强与调整** 调整对比度:`imadjust(image_data)`;调整大小:`imresize(image_data, 0.5)`。 - **多光谱/多波段处理** 提取第3个波段:`band3 = image_data(:,:,3);` 合并多波段:`multispectral = cat(3, band1, band2, band3);` - **三维数据操作** 对多页TIFF堆叠进行均值投影: ```matlab avg_projection = mean(image_stack, 3); ``` #### 4. **注意事项** - **数据类型转换** TIFF通常存储为`uint8`或`uint16`,计算时需转换为`double`: ```matlab image_double = im2double(image_data); ``` - **处理大文件** 使用`blockproc`分块读取大型TIFF,避免内存溢出[^1]。 - **地理信息保留** 修改GeoTIFF数据时,需同步更新空间参考信息。 ---
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值