利用MATLAB 实现高光谱影像区域截取操作
欢迎学习交流!
邮箱: z…@1…6.com
网站: https://zephyrhours.github.io/
前言:
进行高光谱图像处理或者普通的二维图像处理过程中,有时候我们需要选择图像中的某个区域进行实验,因此我们渴望在高光谱影像中有一个屏幕截图的类似功能,以方便我们根据感兴趣区域实现区域的截取,下面是笔者编写的一个matlab程序,以供学者参考研究。
1.相关函数说明
- gca: 返回当前图形窗口上的当前坐标轴对象的句柄。如果坐标轴对象不存在,则MATLAB自动创建坐标轴对象,并返回其句柄。如果用户不希望MATLAB自动创建坐标轴对象,可以使用如下命令:get(gcf,‘CurrentAxes’)【这里可以理解为gca表示当前的图】。
- rbbox:用于返回所选择的区域
- get: 通常获得某个对象(即object)的属性,用法为get(对象句柄, ‘属性名’)
2. Matlab 代码
相关说明:
- 下面以lena图像为例子进行展示
- 该代码适用于绝大多数影像:可用于自然图像、高分影像和高光谱影像
说再多,其实都不如代码来的痛快,下面是笔者的代码,分享给各位看官老爷。
clc;clear;close all;
I = imread('C:\Users\ZephyrHou\Documents\MATLAB\datas\lena.jpg');
imshow(I);
k = waitforbuttonpress; % 等待鼠标按下
point1 = get(gca,'CurrentPoint'); % 鼠标按下了,gca表示当前的图
finalRect = rbbox; % 返回所选择的区域
point2 = get(gca,'CurrentPoint'); % 鼠标松开了
point1 = point1(1,1:2); % 提取出两个点,
point2 = point2(1,1:2);
% 计算位置p1为左上角坐标,p2为右下角坐标
p1 = min(floor(point1),floor(point2));
p2 = max(floor(point1),floor(point2));
offset = abs(floor(point1)-floor(point2)); % offset(1)表示宽,offset(2)表示高
x = [p1(1) p1(1)+offset(1) p1(1)+offset(1) p1(1) p1(1)];
y = [p1(2) p1(2) p1(2)+offset(2) p1(2)+offset(2) p1(2)];
hold on %防止plot时闪烁
plot(x,y,'r');
% 保存选择区域图像
[rows,cols,bands]=size(I);
if bands==1
CutI=I(p1(2):p2(2),p1(1):p2(1));
else
CutI=I(p1(2):p2(2),p1(1):p2(1),:);
end
imwrite(CutI,'C:\Users\ZephyrHou\Desktop\cutImg.tiff');
3. 具体效果
- 原始lena图像
- 裁剪区域图像
后记
感谢Lena为数字图像处理领域做出的重大贡献。
她是让无数专家为之痴迷和痛苦的研究对象,她是充斥着枯燥数学公式的论文中最吸引眼球的光芒,翻开任何一本关于计算机图像处理的教材,你都能看到她动人的微笑。她就是雷娜(Lena),她的照片是图像处理领域使用最为广泛的标准测试图。她是真人吗?她到底从何而来?
感兴趣的小伙伴可读:
最后奉上Lena现在的照片,并感谢Lena做出的贡献,您在我们心中永远年轻!