关于matlab GUI 中 多个plot(handles.axes) 无法hold on的问题

博客提及在Matlab中,使用hold(handles.axes,'on')可实现相关绘图操作,涉及Matlab绘图及GUI相关内容。

只需要hold(handles.axes,’on’) 就可以啦

1. 【编写思路】:响应用户输入,简要阐述修改代码的思路。 2. 【编写步骤及编写代码】: a. 列明编写步骤,阐述用户可操作的编写方法。 b. 直接在原代码片段上进行编辑后输出,代码要满足需求、可正确运行。 c. 并在注释中标明改动点。 3. 【代码调用示例】:给出正确调用和运行代码的输入输出示例,跟代码片段一起输出,并且增加注释说明,必要时给出代码运行的依赖和运行方式。 a. 简单代码给出输入输出示例。 b. 复杂代码不给输出示例。 4. 【代码解释】:概括解释给出的代码和调用示例,重点对修改点进行解释说明,要求语言通顺易懂,详略得当,格式清晰。 5. 【注意事项和其他补充说明】:如其他修改思路等。你回答得结构必须按找这样输出,function varargout = QIKONGMIANJI(varargin) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @QIKONGMIANJI_OpeningFcn, ... 'gui_OutputFcn', @QIKONGMIANJI_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end function QIKONGMIANJI_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; % 初始化轮廓线句柄 handles.contourLine = []; handles.contourPoints = []; % 存储描点数据 guidata(hObject, handles); function varargout = QIKONGMIANJI_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; % --- 灰度化按钮 function pushbutton3_Callback(hObject, eventdata, handles) if ~isfield(handles, 'originalImage') errordlg('请先加载图像!', '错误'); return; end originalImage = handles.originalImage; if size(originalImage, 3) == 3 grayImage = rgb2gray(originalImage); else grayImage = originalImage; end axes(handles.axes2); imshow(grayImage, []); title('灰度化后的图像'); set(gca, 'XTick', [], 'YTick', []); handles.grayImage = grayImage; guidata(hObject, handles); % --- 二值化按钮 function pushbutton4_Callback(hObject, eventdata, handles) if ~isfield(handles, 'grayImage') errordlg('请先进行图像灰度化处理!', '错误'); return; end grayImage = handles.grayImage; binaryImage = imbinarize(grayImage); axes(handles.axes3); imshow(binaryImage); title('二值化后的图像'); set(gca, 'XTick', [], 'YTick', []); handles.binaryImage = binaryImage; guidata(hObject, handles); function edit1_Callback(hObject, eventdata, handles) function edit1_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end % --- 描点提取轮廓按钮 (只描点不计算) function pushbutton5_Callback(hObject, eventdata, handles) % 检查必要数据是否存在 if ~isfield(handles, 'binaryImage') || ~isfield(handles, 'scale') errordlg('请先完成图像二值化和比例尺标定!', '错误'); return; end % 准备图像显示 axes(handles.axes3); imshow(handles.binaryImage); title('点击提取轮廓 - 按Enter结束'); % 删除旧的轮廓线 if isfield(handles, 'contourLine') % 检查contourLine是否是有效的图形句柄 if all(ishandle(handles.contourLine)) delete(handles.contourLine); end handles = rmfield(handles, 'contourLine'); end % 用户交互描点 try [x, y] = ginput(); catch return; % 用户取消操作 end % 检查是否有点被选取 if isempty(x) return; end % 保存描点数据 handles.contourPoints = [x, y]; % 存储描点坐标 % 绘制轮廓点(不闭合) hold on; handles.contourLine = plot(x, y, 'ro', 'MarkerSize', 5, 'MarkerFaceColor', 'r'); title('已描点 - 请点击"提取完成"按钮'); hold off; % 保存数据 guidata(hObject, handles); % --- 提取完成按钮 (计算面积并显示结果) function pushbutton6_Callback(hObject, eventdata, handles) % 检查是否有描点数据 if ~isfield(handles, 'contourPoints') || isempty(handles.contourPoints) errordlg('请先使用"描点提取轮廓"按钮进行描点!', '错误'); return; end % 获取描点数据 points = handles.contourPoints; x = points(:,1); y = points(:,2); % 闭合轮廓 x(end+1) = x(1); y(end+1) = y(1); % 在axes3中绘制完整轮廓 axes(handles.axes3); hold on; % 删除之前的点 if isfield(handles, 'contourLine') && all(ishandle(handles.contourLine)) delete(handles.contourLine); end % 绘制闭合轮廓 handles.contourLine = plot(x, y, 'r-', 'LineWidth', 2); hold off; title('提取的轮廓'); % 计算面积 mask = poly2mask(x, y, size(handles.binaryImage, 1), size(handles.binaryImage, 2)); pixelArea = sum(mask(:)); actualArea = pixelArea * (handles.scale)^2; % 显示结果 set(handles.edit1, 'String', sprintf('%.2f', actualArea)); msgbox(sprintf('气孔面积: %.2f μm²', actualArea), '计算结果'); % 在axes4中显示带有轮廓的图像 axes(handles.axes4); % 显示原始二值图像 imshow(handles.binaryImage); hold on; % 绘制轮廓 plot(x, y, 'r-', 'LineWidth', 2); % 标记轮廓点 plot(points(:,1), points(:,2), 'ro', 'MarkerSize', 5, 'MarkerFaceColor', 'r'); hold off; title('气孔轮廓提取结果'); set(gca, 'XTick', [], 'YTick', []); % 保存数据 handles.actualArea = actualArea; guidata(hObject, handles); % --- 清除轮廓按钮 function pushbutton7_Callback(hObject, eventdata, handles) % 清除轮廓线 if isfield(handles, 'contourLine') % 检查contourLine是否是有效的图形句柄 if all(ishandle(handles.contourLine)) delete(handles.contourLine); end handles = rmfield(handles, 'contourLine'); end % 清除轮廓数据 if isfield(handles, 'contourPoints') handles = rmfield(handles, 'contourPoints'); end if isfield(handles, 'actualArea') handles = rmfield(handles, 'actualArea'); end % 重置显示 if isfield(handles, 'binaryImage') axes(handles.axes3); imshow(handles.binaryImage); title('二值化后的图像'); axes(handles.axes4); cla; % 清除axes4的内容 set(gca, 'XTick', [], 'YTick', []); end set(handles.edit1, 'String', ''); guidata(hObject, handles); % --- 加载图像按钮 function pushbutton1_Callback(hObject, eventdata, handles) [filename, pathname] = uigetfile(... {'*.jpg;*.jpeg;*.png;*.bmp;*.tif;*.tiff', 'Image Files (*.jpg, *.png, *.bmp, *.tif)'},... '选择涂层图像'); if isequal(filename, 0) return; end imgPath = fullfile(pathname, filename); handles.originalImage = imread(imgPath); axes(handles.axes1); imshow(handles.originalImage); title('原始涂层图像 - 请绘制比例尺线段'); hold off; msgbox({'请按以下步骤标定比例尺:', ... '1. 在图像上点击并拖动绘制一条线段', ... '2. 线段应代表已知的实际长度', ... '3. 绘制完成后输入该线段的实际长度(μm)'}, ... '比例尺标定说明', 'help'); hLine = imline(handles.axes1); hLine.setColor('r'); position = wait(hLine); dx = diff(position(:,1)); dy = diff(position(:,2)); pixelLength = sqrt(dx^2 + dy^2); prompt = {'输入该线段代表的实际长度 (μm):'}; dlgtitle = '比例尺标定'; dims = [1 35]; definput = {'100'}; answer = inputdlg(prompt, dlgtitle, dims, definput); if isempty(answer) delete(hLine); return; end try realLength = str2double(answer{1}); if isnan(realLength) || realLength <= 0 error('请输入正数作为实际长度'); end handles.scale = realLength / pixelLength; axes(handles.axes1); hold on; plot(position(:,1), position(:,2), 'r-', 'LineWidth', 2); text(mean(position(:,1)), mean(position(:,2)), ... sprintf('%.2f μm', realLength), ... 'Color', 'r', 'FontSize', 12, 'FontWeight', 'bold'); hold off; guidata(hObject, handles); msgbox(sprintf('比例尺标定成功! 比例: %.4f μm/像素', handles.scale), ... '标定完成', 'help'); catch ME delete(hLine); errordlg(['错误: ' ME.message], '标定失败'); end % --- 重新标定按钮 function pushbutton2_Callback(hObject, eventdata, handles) if ~isfield(handles, 'originalImage') errordlg('请先加载图像!', '错误'); return; end if ~strcmp(questdlg('确定要重新标定比例尺吗?', '重新标定', '是', '否', '否'), '是') return; end if isfield(handles, 'scale') handles = rmfield(handles, 'scale'); end cla(handles.axes1); imshow(handles.originalImage, 'Parent', handles.axes1); title(handles.axes1, '原始涂层图像 - 请绘制比例尺线段'); msgbox({'请按以下步骤标定比例尺:', ... '1. 在图像上点击并拖动绘制一条线段', ... '2. 线段应代表已知的实际长度', ... '3. 绘制完成后输入该线段的实际长度(μm)'}, ... '比例尺标定说明', 'help'); hLine = imline(handles.axes1); hLine.setColor('r'); position = wait(hLine); dx = diff(position(:,1)); dy = diff(position(:,2)); pixelLength = sqrt(dx^2 + dy^2); prompt = {'输入该线段代表的实际长度 (μm):'}; dlgtitle = '比例尺标定'; dims = [1 35]; definput = {'100'}; answer = inputdlg(prompt, dlgtitle, dims, definput); if isempty(answer) delete(hLine); return; end try realLength = str2double(answer{1}); if isnan(realLength) || realLength <= 0 error('请输入正数作为实际长度'); end handles.scale = realLength / pixelLength; axes(handles.axes1); hold on; plot(position(:,1), position(:,2), 'r-', 'LineWidth', 2); text(mean(position(:,1)), mean(position(:,2)), ... sprintf('%.2f μm', realLength), ... 'Color', 'r', 'FontSize', 12, 'FontWeight', 'bold'); hold off; guidata(hObject, handles); msgbox(sprintf('比例尺标定成功! 比例: %.4f μm/像素', handles.scale), ... '标定完成', 'help'); catch ME delete(hLine); errordlg(['错误: ' ME.message], '标定失败'); end % --- 其他未使用按钮的空回调 function pushbutton8_Callback(hObject, eventdata, handles) function pushbutton9_Callback(hObject, eventdata, handles) function pushbutton10_Callback(hObject, eventdata, handles) 上述代码确实实现了气孔面积的提取,但是有一些瑕疵,我想通过点击pushbutton5按钮只对axes3坐标系中的图片进行描点提取轮廓,然后边点击边显示已经描过的点,然后再点击pushbutton6按钮即可提取完成并同时将提取轮廓的图片显示在axes4中,而不是点击enter键提取完成,请帮我是实现这个功能,并提供完整的代码给我 这是我得问题
最新发布
06-26
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值