一、问题的提出
网友后台私信问:能提供一些高光谱遥感图像处理的程序么,如融合,去噪,配准,像元分解以及分类等处理。
作者以前也接触过遥感图像处理,用过ArcGIS软件。但已经很久没使用了,ArcGIS版本目前也升级了很多,所以,也想了解一下matlab在遥感图像处理中有哪些新功能。应用中发现,今天的高光谱图像处除了基础的图像处理工具箱,还追加安装了另外的三个工具箱,可见,matlab目前在遥感图像处理方面功能已经很强大。
二、向DeepSeek求助
1、提问
根据经验与实际,提问如下(因为不是很专业,提问中有值得商榷的地方,始终作者不是专业遥感图像处理人员,特别是对高光谱遥感图像处理)。
图像处理程序非常受广大网友欢迎,图像处理功能多种多样,以前写的程序基本都涵盖了,例如,我在《MATLAB大作业选登-图像叠加(模糊图像处理)》文章的相关链接中归纳了18个大作业程序。现在需要提供一些高光谱遥感图像处理的程序,如融合,去噪,配准,像元分解以及分类等处理。请帮我写一个在matlab环境下运行的图像处理程序,有界面,可以读取一张图片,并在坐标轴中显示原图,然后有融合、去噪、配准、像元分解等功能按钮,完成处理后结果显示在另一个坐标轴中。
2、解答、程序及运行结果
程序代码如下:
function hyperspectral_processor()
% 创建主窗口
fig = figure('Name','高光谱图像处理器', 'NumberTitle','off',...
'Position',[200 200 1000 600], 'MenuBar','none');
% 创建UI组件
createComponents(fig);
% 初始化数据结构
handles = struct('originalImg',[], 'processedImg',[],...
'axes1',[], 'axes2',[], 'statusBar',[]);
guidata(fig, handles);
end
function createComponents(fig)
% 创建坐标轴
handles.axes1 = axes('Parent',fig, 'Position',[0.05 0.35 0.4 0.6]);
title(handles.axes1, '原始图像');
handles.axes2 = axes('Parent',fig, 'Position',[0.55 0.35 0.4 0.6]);
title(handles.axes2, '处理结果');
% 创建按钮
uicontrol('Style','pushbutton', 'String','加载图像',...
'Position',[50 50 100 30], 'Callback',@loadImage);
uicontrol('Style','pushbutton', 'String','图像融合',...
'Position',[160 50 100 30], 'Callback',@imageFusion);
uicontrol('Style','pushbutton', 'String','图像去噪',...
'Position',[270 50 100 30], 'Callback',@imageDenoise);
uicontrol('Style','pushbutton', 'String','图像配准',...
'Position',[380 50 100 30], 'Callback',@imageRegistration);
uicontrol('Style','pushbutton', 'String','像元分解',...
'Position',[490 50 100 30], 'Callback',@pixelUnmixing);
% 状态栏
handles.statusBar = uicontrol('Style','text', 'String','就绪',...
'Position',[50 20 500 20],...
'HorizontalAlignment','left');
guidata(fig, handles);
end
%% 回调函数
function loadImage(src, event)
handles = guidata(gcbo);
[file, path] = uigetfile({'*.mat;*.tif;*.hdr','高光谱文件(*.mat,*.tif,*.hdr)'});
if isequal(file,0)
return;
end
try
% 读取高光谱数据(示例以MAT文件格式)
data = load(fullfile(path, file));
fieldName = fieldnames(data);
hyperspectralData = data.(fieldName{1});
% 显示第一个波段
axes(handles.axes1);
imshow(hyperspectralData(:,:,1), []);
title('原始图像 (波段1)');
handles.originalImg = hyperspectralData;
handles.statusBar.String = '图像加载成功';
guidata(gcbo, handles);
catch
errordlg('文件读取失败,请检查数据格式');
end
end
function imageFusion(src, event)
handles = guidata(gcbo);
if isempty(handles.originalImg)
warndlg('请先加载图像','警告');
return;
end
% 示例:PCA融合算法
[height, width, bands] = size(handles.originalImg);
reshapedData = reshape(handles.originalImg,[],bands);
% PCA变换
[coeff, score] = pca(reshapedData);
fusedImage = reshape(score(:,1),height,width);
% 显示结果
axes(handles.axes2);
imshow(fusedImage, []);
title('融合结果(主成分分析)');
handles.statusBar.String = 'PCA融合完成';
guidata(gcbo, handles);
end
function imageDenoise(src, event)
handles = guidata(gcbo);
% 示例:小波去噪
noisyBand = handles.originalImg(:,:,1);
denoisedImage = wdenoise2(noisyBand);
axes(handles.axes2);
imshow(denoisedImage, []);
title('去噪结果(小波去噪)');
handles.statusBar.String = '小波去噪完成';
guidata(gcbo, handles);
end
function imageRegistration(src, event)
handles = guidata(gcbo);
% 示例:基于特征的配准
fixed = handles.originalImg(:,:,1);
moving = imtranslate(fixed,[5 5]); % 模拟位移
% 特征检测
pointsA = detectSURFFeatures(fixed);
pointsB = detectSURFFeatures(moving);
% 特征匹配
[featuresA, validPointsA] = extractFeatures(fixed,pointsA);
[featuresB, validPointsB] = extractFeatures(moving,pointsB);
indexPairs = matchFeatures(featuresA,featuresB);
% 显示匹配结果
axes(handles.axes2); showMatchedFeatures(fixed,moving,validPointsA(indexPairs(:,1)),...
validPointsB(indexPairs(:,2)),'montage');
title('特征匹配结果');
handles.statusBar.String = '特征配准完成';
guidata(gcbo, handles);
end
function pixelUnmixing(src, event)
handles = guidata(gcbo);
% 示例:线性解混(需提前设置端元)
hyperspectralData = double(handles.originalImg);
[height, width, bands] = size(hyperspectralData);
% 假设存在3个端元(实际需用VCA/N-FINDR算法提取)
endmembers = rand(3,bands); % 随机生成示例端元
% 解混计算
abundanceMaps = zeros(height,width,3);
for i = 1:height
for j = 1:width
spectrum = squeeze(hyperspectralData(i,j,:))';
abundanceMaps(i,j,:) = lsqnonneg(endmembers', spectrum');
end
end
% 显示丰度图
axes(handles.axes2);
imshow(abundanceMaps(:,:,1), []);
title('端元1丰度图');
handles.statusBar.String = '线性解混完成';
guidata(gcbo, handles);
end
function hyperspectral_processor() % 创建主窗口 fig = figure('Name','高光谱图像处理器', 'NumberTitle','off',... 'Position',[200 200 1000 600], 'MenuBar','none'); % 创建UI组件 createComponents(fig); % 初始化数据结构 handles = struct('originalImg',[], 'processedImg',[],... 'axes1',[], 'axes2',[], 'statusBar',[]); guidata(fig, handles);endfunction createComponents(fig) % 创建坐标轴 handles.axes1 = axes('Parent',fig, 'Position',[0.05 0.35 0.4 0.6]); title(handles.axes1, '原始图像'); handles.axes2 = axes('Parent',fig, 'Position',[0.55 0.35 0.4 0.6]); title(handles.axes2, '处理结果'); % 创建按钮 uicontrol('Style','pushbutton', 'String','加载图像',... 'Position',[50 50 100 30], 'Callback',@loadImage); uicontrol('Style','pushbutton', 'String','图像融合',... 'Position',[160 50 100 30], 'Callback',@imageFusion); uicontrol('Style','pushbutton', 'String','图像去噪',... 'Position',[270 50 100 30], 'Callback',@imageDenoise); uicontrol('Style','pushbutton', 'String','图像配准',... 'Position',[380 50 100 30], 'Callback',@imageRegistration); uicontrol('Style','pushbutton', 'String','像元分解',... 'Position',[490 50 100 30], 'Callback',@pixelUnmixing); % 状态栏 handles.statusBar = uicontrol('Style','text', 'String','就绪',... 'Position',[50 20 500 20],... 'HorizontalAlignment','left'); guidata(fig, handles);end%% 回调函数function loadImage(src, event) handles = guidata(gcbo); [file, path] = uigetfile({'*.mat;*.tif;*.hdr','高光谱文件(*.mat,*.tif,*.hdr)'}); if isequal(file,0) return; end try % 读取高光谱数据(示例以MAT文件格式) data = load(fullfile(path, file)); fieldName = fieldnames(data); hyperspectralData = data.(fieldName{1}); % 显示第一个波段 axes(handles.axes1); imshow(hyperspectralData(:,:,1), []); title('原始图像 (波段1)'); handles.originalImg = hyperspectralData; handles.statusBar.String = '图像加载成功'; guidata(gcbo, handles); catch errordlg('文件读取失败,请检查数据格式'); endendfunction imageFusion(src, event) handles = guidata(gcbo); if isempty(handles.originalImg) warndlg('请先加载图像','警告'); return; end % 示例:PCA融合算法 [height, width, bands] = size(handles.originalImg); reshapedData = reshape(handles.originalImg,[],bands); % PCA变换 [coeff, score] = pca(reshapedData); fusedImage = reshape(score(:,1),height,width); % 显示结果 axes(handles.axes2); imshow(fusedImage, []); title('融合结果(主成分分析)'); handles.statusBar.String = 'PCA融合完成'; guidata(gcbo, handles);endfunction imageDenoise(src, event) handles = guidata(gcbo); % 示例:小波去噪 noisyBand = handles.originalImg(:,:,1); denoisedImage = wdenoise2(noisyBand); axes(handles.axes2); imshow(denoisedImage, []); title('去噪结果(小波去噪)'); handles.statusBar.String = '小波去噪完成'; guidata(gcbo, handles);endfunction imageRegistration(src, event) handles = guidata(gcbo); % 示例:基于特征的配准 fixed = handles.originalImg(:,:,1); moving = imtranslate(fixed,[5 5]); % 模拟位移 % 特征检测 pointsA = detectSURFFeatures(fixed); pointsB = detectSURFFeatures(moving); % 特征匹配 [featuresA, validPointsA] = extractFeatures(fixed,pointsA); [featuresB, validPointsB] = extractFeatures(moving,pointsB); indexPairs = matchFeatures(featuresA,featuresB); % 显示匹配结果 axes(handles.axes2); showMatchedFeatures(fixed,moving,validPointsA(indexPairs(:,1)),... validPointsB(indexPairs(:,2)),'montage'); title('特征匹配结果'); handles.statusBar.String = '特征配准完成'; guidata(gcbo, handles);endfunction pixelUnmixing(src, event) handles = guidata(gcbo); % 示例:线性解混(需提前设置端元) hyperspectralData = double(handles.originalImg); [height, width, bands] = size(hyperspectralData); % 假设存在3个端元(实际需用VCA/N-FINDR算法提取) endmembers = rand(3,bands); % 随机生成示例端元 % 解混计算 abundanceMaps = zeros(height,width,3); for i = 1:height for j = 1:width spectrum = squeeze(hyperspectralData(i,j,:))'; abundanceMaps(i,j,:) = lsqnonneg(endmembers', spectrum'); end end % 显示丰度图 axes(handles.axes2); imshow(abundanceMaps(:,:,1), []); title('端元1丰度图'); handles.statusBar.String = '线性解混完成'; guidata(gcbo, handles);end
程序运行后的界面
程序支持三种文件,mat、tif、hdr
3、创建高光谱图像文件
程序运行后发现,我手头并没有,所以,只好继续请DeepSeek帮助。提问:我需要一张高光遥感图像文件,试一下这个程序是否达到预期目标。
最后选择模拟生成高光谱数据
% 生成模拟高光谱数据(100×100×50波段)
hyperspectral_data = zeros(100,100,50);
for b=1:50
hyperspectral_data(:,:,b) = imnoise(ones(100)*0.5,'gaussian',0,0.01*b);
end
save('test_data.mat','hyperspectral_data');
.rtcContent { padding: 30px; } .lineNode {font-size: 10pt; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-style: normal; font-weight: normal; }% 生成模拟高光谱数据(100×100×50波段)hyperspectral_data = zeros(100,100,50);for b=1:50 hyperspectral_data(:,:,b) = imnoise(ones(100)*0.5,'gaussian',0,0.01*b);endsave('test_data.mat','hyperspectral_data');
4、对新问题继续提问DeepSeek
高光谱图像文件准备好后,运行时并不顺利,出现程序错误。
程序运行出现错误:
错误使用 axes
坐标区句柄无效
出错 hyperspectral_processor>loadImage (第 57 行)
axes(handles.axes1);
^^^^^^^^^^^^^^^^^^^
计算 UIControl Callback 时出错。
继续提问如下:程序出现错误,错误信息原样告诉DeepSeek。
5、最终结果及程序
我不想花时间调试程序,我更想让DeepSeek为我提供用App Designer平台设计的程序,所以,接着问:
还是用新版MATLAB的App Designer来帮我设计一套完整的程序吧,App Designer不容易出错
这次思考的内容不多,直接给出了程序代码如下:
classdef HyperspectralProcessor < matlab.apps.AppBase
% 公共属性
properties (Access = public)
UIFigure matlab.ui.Figure
ImageAxes matlab.ui.control.UIAxes
LoadButton matlab.ui.control.Button
BandSlider matlab.ui.control.Slider
StatusLabel matlab.ui.control.Label
ProcessPanel matlab.ui.container.Panel
FusionButton matlab.ui.control.Button
DenoiseButton matlab.ui.control.Button
RegisterButton matlab.ui.control.Button
UnmixButton matlab.ui.control.Button
end
% 私有属性(数据存储)
properties (Access = private)
OriginalData % 原始高光谱数据 [height x width x bands]
ProcessedData % 处理后的数据
CurrentBand = 1 % 当前显示波段
NumBands = 0 % 总波段数
end
% 应用初始化方法
methods (Access = private)
% 创建UI组件
function createComponents(app)
% 创建主窗口
app.UIFigure = uifigure('Name', '高光谱处理器', 'Position', [100 100 1200 800]);
% 创建图像显示区域
app.ImageAxes = uiaxes(app.UIFigure, 'Position', [50 150 700 600]);
title(app.ImageAxes, '高光谱数据可视化');
colormap(app.ImageAxes, 'jet');
% 创建控制面板
app.ProcessPanel = uipanel(app.UIFigure, 'Title', '处理工具',...
'Position', [800 150 350 600]);
% 加载按钮
app.LoadButton = uibutton(app.UIFigure, 'Position', [50 50 100 30],...
'Text', '加载数据', 'ButtonPushedFcn', createCallbackFcn(app, @LoadButtonPushed, true));
% 波段滑块
app.BandSlider = uislider(app.UIFigure, 'Position', [200 50 500 30],...
'Limits', [0 1], 'ValueChangedFcn', createCallbackFcn(app, @BandSliderValueChanged, true));
% 状态标签
app.StatusLabel = uilabel(app.UIFigure, 'Position', [800 50 300 30],...
'Text', '就绪', 'FontColor', [0.5 0.5 0.5]);
% 处理按钮
buttonY = 550;
app.FusionButton = uibutton(app.ProcessPanel, 'Position', [20 buttonY 150 30],...
'Text', 'PCA融合', 'ButtonPushedFcn', createCallbackFcn(app, @FusionButtonPushed, true));
buttonY = buttonY - 50;
app.DenoiseButton = uibutton(app.ProcessPanel, 'Position', [20 buttonY 150 30],...
'Text', '小波去噪', 'ButtonPushedFcn', createCallbackFcn(app, @DenoiseButtonPushed, true));
buttonY = buttonY - 50;
app.RegisterButton = uibutton(app.ProcessPanel, 'Position', [20 buttonY 150 30],...
'Text', '图像配准', 'ButtonPushedFcn', createCallbackFcn(app, @RegisterButtonPushed, true));
buttonY = buttonY - 50;
app.UnmixButton = uibutton(app.ProcessPanel, 'Position', [20 buttonY 150 30],...
'Text', '像元分解', 'ButtonPushedFcn', createCallbackFcn(app, @UnmixButtonPushed, true));
end
% 更新图像显示
function updateDisplay(app)
if ~isempty(app.OriginalData)
band = round(app.CurrentBand);
img = app.OriginalData(:,:,band);
imshow(img, [], 'Parent', app.ImageAxes);
app.StatusLabel.Text = sprintf('波段: %d/%d | 最小值: %.2f | 最大值: %.2f',...
band, app.NumBands, min(img(:)), max(img(:)));
end
end
end
% 回调函数
methods (Access = private)
% 加载数据回调
function LoadButtonPushed(app, ~)
[file, path] = uigetfile({'*.mat','MAT Files';'*.hdr','ENVI Files'});
if isequal(file, 0)
return;
end
try
% 加载数据
data = load(fullfile(path, file));
app.OriginalData = data.hyperspectral_data;
% 初始化参数
[h, w, b] = size(app.OriginalData);
app.NumBands = b;
app.BandSlider.Limits = [1 b];
app.CurrentBand = 1;
% 显示第一个波段
updateDisplay(app);
app.StatusLabel.Text = '数据加载成功!';
catch
errordlg('数据加载失败,请检查文件格式');
end
end
% 波段切换回调
function BandSliderValueChanged(app, event)
app.CurrentBand = event.Value;
updateDisplay(app);
end
% PCA融合回调
function FusionButtonPushed(app, ~)
if isempty(app.OriginalData)
errordlg('请先加载数据');
return;
end
% 执行PCA融合
X = reshape(app.OriginalData, [], app.NumBands);
[coeff, ~] = pca(X);
fused = reshape(X * coeff(:,1), size(app.OriginalData,1), []);
% 显示结果
imshow(fused, [], 'Parent', app.ImageAxes);
app.StatusLabel.Text = 'PCA融合完成(第一主成分)';
end
% 小波去噪回调
function DenoiseButtonPushed(app, ~)
% 实现小波去噪逻辑(示例使用软阈值)
img = app.OriginalData(:,:,app.CurrentBand);
[thr, sorh] = ddencmp('den','wv',img);
denoised = wdencmp('gbl', img, 'sym4', 2, thr, sorh);
% 显示去噪结果
imshow(denoised, [], 'Parent', app.ImageAxes);
app.StatusLabel.Text = '当前波段去噪完成';
end
% 图像配准回调
function RegisterButtonPushed(app, ~)
% 实现基于SURF的配准(需要两个输入)
% 此处为示例逻辑,需要补充完整
[fixImg, movImg] = prepareRegistrationData();
% 特征检测
fixPoints = detectSURFFeatures(fixImg);
movPoints = detectSURFFeatures(movImg);
% 特征匹配
[features1, validPoints1] = extractFeatures(fixImg, fixPoints);
[features2, validPoints2] = extractFeatures(movImg, movPoints);
indexPairs = matchFeatures(features1, features2);
% 显示匹配结果
showMatchedFeatures(fixImg, movImg, validPoints1(indexPairs(:,1)),...
validPoints2(indexPairs(:,2)), 'Parent', app.ImageAxes);
app.StatusLabel.Text = '特征匹配结果展示';
end
% 像元分解回调
function UnmixButtonPushed(app, ~)
% 实现N-FINDR端元提取
endmembers = nfindr(app.OriginalData, 3); % 假设提取3个端元
% 最小二乘解混
abundances = unmix(app.OriginalData, endmembers);
% 显示丰度图
imshow(abundances(:,:,1), [], 'Parent', app.ImageAxes);
app.StatusLabel.Text = '端元1丰度分布';
end
end
% 应用入口
methods (Access = public)
function app = HyperspectralProcessor
createComponents(app)
end
end
end
.rtcContent { padding: 30px; } .lineNode {font-size: 10pt; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-style: normal; font-weight: normal; }classdef HyperspectralProcessor < matlab.apps.AppBase % 公共属性 properties (Access = public) UIFigure matlab.ui.Figure ImageAxes matlab.ui.control.UIAxes LoadButton matlab.ui.control.Button BandSlider matlab.ui.control.Slider StatusLabel matlab.ui.control.Label ProcessPanel matlab.ui.container.Panel FusionButton matlab.ui.control.Button DenoiseButton matlab.ui.control.Button RegisterButton matlab.ui.control.Button UnmixButton matlab.ui.control.Button end % 私有属性(数据存储) properties (Access = private) OriginalData % 原始高光谱数据 [height x width x bands] ProcessedData % 处理后的数据 CurrentBand = 1 % 当前显示波段 NumBands = 0 % 总波段数 end % 应用初始化方法 methods (Access = private) % 创建UI组件 function createComponents(app) % 创建主窗口 app.UIFigure = uifigure('Name', '高光谱处理器', 'Position', [100 100 1200 800]); % 创建图像显示区域 app.ImageAxes = uiaxes(app.UIFigure, 'Position', [50 150 700 600]); title(app.ImageAxes, '高光谱数据可视化'); colormap(app.ImageAxes, 'jet'); % 创建控制面板 app.ProcessPanel = uipanel(app.UIFigure, 'Title', '处理工具',... 'Position', [800 150 350 600]); % 加载按钮 app.LoadButton = uibutton(app.UIFigure, 'Position', [50 50 100 30],... 'Text', '加载数据', 'ButtonPushedFcn', createCallbackFcn(app, @LoadButtonPushed, true)); % 波段滑块 app.BandSlider = uislider(app.UIFigure, 'Position', [200 50 500 30],... 'Limits', [0 1], 'ValueChangedFcn', createCallbackFcn(app, @BandSliderValueChanged, true)); % 状态标签 app.StatusLabel = uilabel(app.UIFigure, 'Position', [800 50 300 30],... 'Text', '就绪', 'FontColor', [0.5 0.5 0.5]); % 处理按钮 buttonY = 550; app.FusionButton = uibutton(app.ProcessPanel, 'Position', [20 buttonY 150 30],... 'Text', 'PCA融合', 'ButtonPushedFcn', createCallbackFcn(app, @FusionButtonPushed, true)); buttonY = buttonY - 50; app.DenoiseButton = uibutton(app.ProcessPanel, 'Position', [20 buttonY 150 30],... 'Text', '小波去噪', 'ButtonPushedFcn', createCallbackFcn(app, @DenoiseButtonPushed, true)); buttonY = buttonY - 50; app.RegisterButton = uibutton(app.ProcessPanel, 'Position', [20 buttonY 150 30],... 'Text', '图像配准', 'ButtonPushedFcn', createCallbackFcn(app, @RegisterButtonPushed, true)); buttonY = buttonY - 50; app.UnmixButton = uibutton(app.ProcessPanel, 'Position', [20 buttonY 150 30],... 'Text', '像元分解', 'ButtonPushedFcn', createCallbackFcn(app, @UnmixButtonPushed, true)); end % 更新图像显示 function updateDisplay(app) if ~isempty(app.OriginalData) band = round(app.CurrentBand); img = app.OriginalData(:,:,band); imshow(img, [], 'Parent', app.ImageAxes); app.StatusLabel.Text = sprintf('波段: %d/%d | 最小值: %.2f | 最大值: %.2f',... band, app.NumBands, min(img(:)), max(img(:))); end end end % 回调函数 methods (Access = private) % 加载数据回调 function LoadButtonPushed(app, ~) [file, path] = uigetfile({'*.mat','MAT Files';'*.hdr','ENVI Files'}); if isequal(file, 0) return; end try % 加载数据 data = load(fullfile(path, file)); app.OriginalData = data.hyperspectral_data; % 初始化参数 [h, w, b] = size(app.OriginalData); app.NumBands = b; app.BandSlider.Limits = [1 b]; app.CurrentBand = 1; % 显示第一个波段 updateDisplay(app); app.StatusLabel.Text = '数据加载成功!'; catch errordlg('数据加载失败,请检查文件格式'); end end % 波段切换回调 function BandSliderValueChanged(app, event) app.CurrentBand = event.Value; updateDisplay(app); end % PCA融合回调 function FusionButtonPushed(app, ~) if isempty(app.OriginalData) errordlg('请先加载数据'); return; end % 执行PCA融合 X = reshape(app.OriginalData, [], app.NumBands); [coeff, ~] = pca(X); fused = reshape(X * coeff(:,1), size(app.OriginalData,1), []); % 显示结果 imshow(fused, [], 'Parent', app.ImageAxes); app.StatusLabel.Text = 'PCA融合完成(第一主成分)'; end % 小波去噪回调 function DenoiseButtonPushed(app, ~) % 实现小波去噪逻辑(示例使用软阈值) img = app.OriginalData(:,:,app.CurrentBand); [thr, sorh] = ddencmp('den','wv',img); denoised = wdencmp('gbl', img, 'sym4', 2, thr, sorh); % 显示去噪结果 imshow(denoised, [], 'Parent', app.ImageAxes); app.StatusLabel.Text = '当前波段去噪完成'; end % 图像配准回调 function RegisterButtonPushed(app, ~) % 实现基于SURF的配准(需要两个输入) % 此处为示例逻辑,需要补充完整 [fixImg, movImg] = prepareRegistrationData(); % 特征检测 fixPoints = detectSURFFeatures(fixImg); movPoints = detectSURFFeatures(movImg); % 特征匹配 [features1, validPoints1] = extractFeatures(fixImg, fixPoints); [features2, validPoints2] = extractFeatures(movImg, movPoints); indexPairs = matchFeatures(features1, features2); % 显示匹配结果 showMatchedFeatures(fixImg, movImg, validPoints1(indexPairs(:,1)),... validPoints2(indexPairs(:,2)), 'Parent', app.ImageAxes); app.StatusLabel.Text = '特征匹配结果展示'; end % 像元分解回调 function UnmixButtonPushed(app, ~) % 实现N-FINDR端元提取 endmembers = nfindr(app.OriginalData, 3); % 假设提取3个端元 % 最小二乘解混 abundances = unmix(app.OriginalData, endmembers); % 显示丰度图 imshow(abundances(:,:,1), [], 'Parent', app.ImageAxes); app.StatusLabel.Text = '端元1丰度分布'; end end % 应用入口 methods (Access = public) function app = HyperspectralProcessor createComponents(app) end endend
6、运行结果
对高光谱图像处理作者并不熟悉,也不作过多评价,关于程序设计,DeepSeek给出的程序都有注释信息,我也不多解释了,最后给出几个运行结果图示,文章只是提供一点线索,借助DeepSeek,抛砖引玉。
程序启动后的界面
导入模拟的高光谱图像
调整滑动条至新位置,图像变亮
点击“PCA融合”按钮后的结果
窗口右下角有信息提示
领取专属 10元无门槛券
私享最新 技术干货