在GUI打开的图像上选取一个矩形区域并打印出均值方差
在GUI打开的图像上通过鼠标右键选取一个矩形区域并打印出均值方差,这个功能虽然简单却花费了我很长时间才实现。
首先应该有三个回调函数:鼠标按下函数,鼠标移动函数,鼠标释放函数
在图像上输出文字,采用创建text文本对象的方式。
% 按下函数 function downfcn(hObject,event,h0) rectobj = findobj('type','rectangle'); % 先找到当前界面中存在的矩形对象,然后清掉,避免出现多个矩形 delete(rectobj); txtobj = findobj('type','text'); % 找到当前界面中text对象,清除,避免多个文本存在 delete(txtobj); if strcmp(get(gcf,'SelectionType'),'alt') startpt = get(gca,'CurrentPoint'); % button down detected set(gcf,'WindowButtonMotion',{@motionfcn,h0,startpt}); % 注:在按下桉树中回调鼠标移动函数!!! end % 移动函数 function motionfcn(hObject,event,h0,startpt) if strcmp(get(gcf,'SelectionType'),'alt') endpt = get(gca,'CurrentPoint'); % button motion x0 = startpt(1,1); y0 = startpt(1,2); x = endpt(1,1); y = endpt(1,2); w = abs(x-x0); h = abs(y-y0); rect = [min(x0,x) min(y0,y) w h]; rectobj = findobj('type','rectangle'); % 先找到上一次画的矩形并清除
delete(rectobj);
txtobj = findobj('type','text');
delete(txtobj);
rectangle('Position',rect,'EdgeColor',[1,1,0]);
txt = text;
x0 = fix(x0); y0 = fix(y0); x = fix(x); y = fix(y);
w = fix(w); h = fix(h);
roi = h0.CData(min(y,y0):min(y,y0)+w-1,min(x,x0):min(x,x0)+h-1);
avgVal = mean2(roi(:));
stdVal = std(roi(:));
str = sprintf('[x,y]:[%d,%d]\r\nWidth:%d\r\nHeight:%d\r\nAVG:%.2f\r\nSTD:%.2f',...
min(x,x0),min(y,y0),w,h,avgVal,stdVal);
set(txt,'String',str,'Position',[max(x,x0),max(y,y0)],'Color',[1 0 0],'VerticalAlignment','top');
end
% 释放函数
function upfcn(hObject,event,h0)
set(gcf,'WindowButtonMotion',''); % 鼠标释放,移动回调函数设为空!!!
在显示图像时回调鼠标按下函数和释放函数:
如下面的代码片段,hs为imshow的句柄。
hs = imshow(temp,[]); set(gcf,'WindowButtonDownFcn',{@downfcn,hs}); set(gcf,'WindowButtonUpFcn',{@upfcn,hs});