首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MATLAB环境下的DeepSeek应用案例-高光谱图像处理器

一、问题的提出

网友后台私信问:能提供一些高光谱遥感图像处理的程序么,如融合,去噪,配准,像元分解以及分类等处理。

作者以前也接触过遥感图像处理,用过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融合”按钮后的结果

窗口右下角有信息提示

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OV7uj0t-b5qOT6dQxyu84U-A0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券