ps是一款强大的图像处理软件,通常的图像处理都可以基于ps去做。但是一些专业的人士对图像有特殊需求,ps难以完成。例如遥感领域的tif图像含有地理参考,ps不能保证图像的头文件是否被修改甚至丢失。此外,遥感影像的像素灰度值不一定是uint8的类型,ps不一定能够保证像素值不被默认改变。
基于一个实际问题,现在需要交互改正遥感影像中制定区域的图像灰度值。采用matlab实现该功能。
若干相关函数介绍:
1)h = imrect;
该函数用于在显示的图像中交互框选图像部分区域,返回一个句柄结构体“h”,h中存储了框选区域的相关数据。
2)rect2 = getPosition(h);
该函数用于读取框选区域的范围参数,rect2是一个一行四列的矩阵,从左到右依次是最小列号、最小行号、列号增量、行号增量;
3)info=geotiffinfo(infilename);
该函数用于获取图像的投影参数,一般来讲,地理信息系统认可大地坐标的头文件,投影坐标图像的头文件也是被认可的,但是头文件中缺少投影定义,该函数可以获取投影定义的相关参数;
4)[~,geoinfoA] = geotiffread(infilename);
该函数用于获取图像的头文件。修改图像不会修改图像的头文件,所以这里先不介绍头文件的手动书写,只将原始头文件粘贴过来即可。
5)geotiffwrite('S_dem.tif',O_dem,geoinfoA,'GeoKeyDirectoryTag', info.GeoTIFFTags.GeoKeyDirectoryTag);
该函数用于写出带有头文件的影像信息,输入参数依次是:'S_dem.tif'输出文件的文件名,O_dem输出图像矩阵,geoinfoA输出图像的头文件,'GeoKeyDirectoryTag'投影定义标题,info.GeoTIFFTags.GeoKeyDirectoryTag投影定义。
基于上述几个关键函数的完整代码如下:
%{读取一个dem图像文件,框选一块区域,将细小区域全部替换例如:框选草地部分,其中包含的其他信息全部替换为草地%}clear;clc;close all;infilename = 'DEM.tif'; % 输入文件的文件名O_dem = imread(infilename); % 读取输入文件[r,c,~] = size(O_dem); % 获取输入文件的尺寸main_value = input('输入替换值:'); % 需要保留的值(交互输入)figure('name','我的示例'); % 创建一个图层,图层名为“我的示例”while 1 % 进入循环,框选修改图像imshow(O_dem); % 显示读取的图像h = imrect; % 在图像中框选一个区域rect2 = getPosition(h); % 获取框选区域的范围mincol = floor(rect2(1)); %最小列号(上边界)minrow = floor(rect2(2)); %最小行号(下边界)maxcol = floor(rect2(1) + rect2(3)); %最大列号(左边界)maxrow = floor(rect2(2) + rect2(4)); %最大行号(有边界)if maxrow > r || maxcol > c % 如果框选区域过大,则跳出循环,不在对图像进行交互操作 break;endO_dem(minrow:maxrow,mincol:maxcol) = main_value; % 用交互输入的灰度值代替框选区域的所有像素值clear h rect2 mincol minrow maxcol maxrow; % 清空变量end[~,geoinfoA] = geotiffread(infilename); % 获取DEM.tif的头文件info=geotiffinfo(infilename); % 获取图像的投影信息imshow(O_dem); % 显示即将输出的图像文件geotiffwrite('S_dem.tif',O_dem,geoinfoA,'GeoKeyDirectoryTag', info.GeoTIFFTags.GeoKeyDirectoryTag); %输出改变后的tif文件msgbox '运行完毕!';
下面演示一下具体操作和效果
1) 点云运行按钮
2) 手动输入一个需要替换的灰度值,例如48.156
3) 在跳出的图层中框选合适的位置,该区域的所有像素灰度值会被替换为手动输入的那个值
4) 重复上述操作,替修正所有待修正区域
5) 框选超出图像的区域造成框选错误,跳出循环体
6) 等待几秒,写出修正后的图像
原始图像:
修正后图像
学到了就点个赞吧?