- ベストアンサー
matlabでマウスで指定した任意の領域の情報取得したい
matlabでマウスで指定した任意の領域の情報取得したい matlabで取り込んだ画像中の任意の領域をマウスのドラッグで範囲を指定し、その領域のデータを取得したいのですがどのようにすればよいのでしょうか? ちなみにMATLABのバージョンはR2009aです よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
三度Kulesです。 これで最後です。 function rCoord=ReviseCoord(handle,Coord) imagesize=size(get(findobj(handle,'Type','Image'),'Cdata')); rCoord=Coord; rCoord(rCoord<1)=1; for k=1:2; if rCoord(k)>imagesize(3-k); rCoord(k)=imagesize(3-k); end; end; function flag=CheckFlag h=findobj(gcf,'Tag','FigureTrim'); if strcmpi(get(h,'Checked'),'On'); flag=true; else flag=false; end; return; エラーが出たらそれも補足に書いていただければと思います。 非常な長文失礼しました。参考になれば幸いです。
その他の回答 (2)
- Kules
- ベストアンサー率47% (292/619)
A No1のKulesです。 続き function GetStartPoint(handle) if CheckFlag; GCDir=pwd; A=round(get(handle,'CurrentPoint')); Coord=ReviseCoord(handle,A(1,[1,2])); rectangle('Position',[Coord,1,1],'EdgeColor','w','LineStyle',':'); save([GCDir '\_StartPoint'],'Coord'); end; return; function ReDrawRect(handle) if CheckFlag; GCDir=pwd; if exist([GCDir '\_StartPoint.mat'],'file'); load([GCDir '\_StartPoint'],'Coord'); A=round(get(handle,'CurrentPoint')); CoordEnd=ReviseCoord(handle,A(1,[1,2])); RectX=min([Coord(1),CoordEnd(1)]); RectY=min([Coord(2),CoordEnd(2)]); RectW=abs(Coord(1)-CoordEnd(1)); RectL=abs(Coord(2)-CoordEnd(2)); if RectW==0; RectW=1; end; if RectL==0; RectL=1; end; h_r=findobj(handle,'Type','Rectangle'); set(h_r,'Position',[RectX,RectY,RectW,RectL]); drawnow; end end; return; function Cut(handle) if CheckFlag; GCDir=pwd; if strcmpi(input('画像を切り出しますか?\n(y/n)\n','s'),'y'); load([GCDir '\_StartPoint'],'Coord'); A=round(get(gca,'CurrentPoint')); CoordEnd=ReviseCoord(handle,A(1,[1,2])); ImageData=get(handle,'Cdata'); RectTop=min([Coord(2),CoordEnd(2)]); RectBottom=max([Coord(2),CoordEnd(2)]); RectLeft=min([Coord(1),CoordEnd(1)]); RectRight=max([Coord(1),CoordEnd(1)]); Cdata=ImageData(RectTop:RectBottom,RectLeft:RectRight); Ratio=size(Cdata); figure; image(Cdata); set(gca,'PlotBoxAspectRatioMode','Manual'); set(gca,'PlotBoxAspectRatio',[Ratio(2);Ratio(1);1]); end; delete([GCDir '\_StartPoint.mat']); end; delete(findobj(gca,'Type','Rectangle')); return; まだ続く
- Kules
- ベストアンサー率47% (292/619)
自分の勉強がてら作ってみました。 あまりエラーに強くは作っていません。 ・画像は属性imageで描かれていること ・属性rectangleのものがないこと がこれを使える条件です。 以下の関数をFigureTrim.mという名前でパスが見えるところ (カレントディレクトリや、マイ ドキュメント\MATLABなど) に保存して、 図を描いたあとFigureTrim(gcf)でOKです。 使い方は 1.メニューバーのTrim->Figure Trimにチェックを入れる 2.画像の好きなところをドラッグで範囲を指定する 3.画像を切り取りますか?とコマンドウィンドウに表示されるのでy→Enter で新たなfigureウィンドウに切り取った箇所が表示されます。 (縦横の縮尺はあっていますが全体の倍率は合っていません) あとはget関数を使ってCdataを切り出すなり保存するなりお好きなようにすればOKです。 少し長い関数なので分けて回答しますが、全部をひとつのmファイルにまとめるようにして下さい。 コメントはほとんどつけていません。何をしているのかわからなかったらその旨補足に記載願います。 function FigureTrim(handle,varargin) if ishandle(handle); switch(lower(get(handle,'Type'))); case 'figure'; InitFigure(handle);% トリムに必要な設定を行う case 'axes'; switch(varargin{1}); case 'Start'; GetStartPoint(handle);% 最初にクリックしたところを保存 case 'Rect'; ReDrawRect(handle);% 切り取る範囲を白点線の四角で表わす end; case 'image'; Cut(handle);% 新たなFigureに切り取った画像を貼り付ける end; else error('切り取りたいfigureのハンドルを渡して下さい'); end; function InitFigure(handle) str_gca='h_a=findobj(gcf,''Type'',''axes'');'; str_gci='h_i=findobj(gcf,''Type'',''image'');'; eval([str_gca,str_gci]); set(h_a,'PlotBoxAspectRatioMode','Manual'); Ratio=size(get(h_i,'Cdata')); set(h_a,'PlotBoxAspectRatio',[Ratio(2);Ratio(1);1]); set(handle,'WindowButtonDownFcn',[str_gca, 'FigureTrim(h_a,''Start'')']); set(handle,'WindowButtonMotionFcn',[str_gca,'FigureTrim(h_a,''Rect'')']); set(handle,'WindowButtonUpFcn',[str_gci,'FigureTrim(h_i);']); h_m=uimenu(handle,'Label','Trim'); h_m1=uimenu(h_m,'Label','Figure Trim','Tag','FigureTrim'); set(h_m1,'CallBack',... ['if strcmpi(get(gcbo,''Checked''),''Off'');' ... 'set(gcbo,''Checked'',''On'');'... 'else set(gcbo,''Checked'',''Off'');end;']); return; 続く
お礼
ありがとうございました! なんとかなりました!!