在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});

  

posted @ 2019-05-13 14:41  zarjen  阅读(244)  评论(0编辑  收藏  举报