• 締切済み

MATLABのプログラミングについてご質問です(2)

MATLAB初心者です。 現在、以下の環境を使っています。 ------------------------------- OS:Windows XP MATLABのバージョン:R2007a ------------------------------- 以下の内容をプログラムでどう組み込めばよいのか分らないため、質問させて頂きました。 詳しい方、ご教授のほどお願いします。 (1)例えば「512x512」サイズの画像を figure に表示させ、その画像の中点を表示させる方法  (画像の中点に「×」マークをつけるイメージです) (2)上記の画像からマウスを使って、座標の始点と終点をクリックしたら"□"(選択範囲)の枠が表示される方法  (マウスを使って画像サイズを小さくしたいのが目的です) (3)上記の画像からマウスを使って、クリックした場所の座標(x軸、y軸)を figure に表示させる方法   (4)uigetdir からディレクトリ選択画面を表示して、指定したディレクトリの絶対パスを取得する方法 (5)画像データを imwrite する時、指定したパス(ディレクトリ)に出力する方法 全てでなくても、判る範囲までのご回答でもかまいません。 よろしくお願いします。

みんなの回答

  • Kules
  • ベストアンサー率47% (292/619)
回答No.2

Kulesです。 >(5): >カレントディレクトリ内のフォルダを想定しています。 >お手数ではございますが、サンプルスクリプトを記載して頂いてもよろしいでしょうか? ん~普通にカレントディレクトリに保存できるならそんな大した話じゃないんですけどね^^; カレントディレクトリ内のhogehogeというフォルダに画像データpiyopiyoをhugahuga.pngという名前で保存したい時 imwrite(piyopiyo,'hogehoge\hugahuga.png); でできます。ただ私自身tifを使わないのでtifでもできるかはわかりません。 そういえば前回(3)をスルーしてましたがよく考えたら(2)よりも簡単ですね… close all; figure(1);set(gcf,'Position',[800 200 560 360]); F=zeros(360,560); [X Y]=meshgrid((1:560),(1:360)); R=sqrt((X-180).^2+(Y-150).^2); F((R>99)&(R<101))=55; h_i=image(F); h_t=text(400,300,'0 0'); set(h_t,'FontSize',14,'Color','r'); % set(gcf,'WindowButtonDownFcn','A=round(get(gca,''CurrentPoint''));set(h_t,''string'',num2str(A(1,[1 2])))');%(1) % set(gcf,'WindowButtonMotionFcn','A=round(get(gca,''CurrentPoint''));set(h_t,''string'',num2str(A(1,[1 2])))');%(2) 最後の2行ですが、(1)とつけてある方をコメント解除するとマウスボタンをクリックした時のみ座標を更新し、(2)とつけてある方をコメント解除するとマウスがfigure内にある限り座標を更新しつづけます。 (1)の中身について具体的に何をしているのかを書くと、 set(gcf,'WindowButtonDownFcn',←figure内でマウスをクリックした時に実行する関数を、この後の文字列で規定します。 'A=round(get(gca,''CurrentPoint''));←現在のマウスカーソルの位置を、2×3の行列で取得します。座標を整数にするためにroundを使っています。 set(h_t,''string'',num2str(A(1,[1 2])))');←A(1,[1 2])がマウスカーソルの位置のx,y座標なのでそれをnum2strで文字列に変換した後、前もって作っておいたテキストのStringにセットしています。 Matlabは正直さまざまな本を読んでも自分の理解度がないと全くわからないのでめんどくさいですが、 とりあえず私が書いたものをいろいろいじればなんとなくわかってくると思います。 また画像に対して何かしたいことがあればfigure、axes、plot、imageなどのハンドルを操ることが必要となってきます。 以上ご参考までに。 (No.3については返事が遅れそうです。)

  • Kules
  • ベストアンサー率47% (292/619)
回答No.1

Kulesです。 前回の質問の話ですがfigureを閉じる関数はcloseだけじゃなくdeleteも あるんですね~初めて知りました。 (1)はそれほど難しくなさそうです。 とりあえず画像は表示されているものとして、 その後に FX=get(gca,'Xlim'); FY=get(gca,'Ylim'); hold on; h_p=plot(mean(FX),mean(FY),'rx'); set(h_p,'MarkerSize',15,'Linewidth',2); hold off; とすることでサイズ15、線の太さ2の×印が中央に打たれるはずです。 (2)は画像をトリムしたいということでしょうか? 説明を書くのはとても難しいのでスクリプトを載せます。 全部でmファイルを3つ作って下さい。 1つ目 trim.m clear all;close all; F=zeros(360,560); [X Y]=meshgrid((1:560),(1:360)); R=sqrt((X-180).^2+(Y-150).^2); F((R>99)&(R<101))=55; figure(1);set(gcf,'Position',[800 200 560 360]); h_i=image(F); axis off; set(gca,'Position',[0 0 1 1],'Clim',[0 64]); set(h_i,'ButtonDownFcn','GetStartPoint'); set(gcf,'WindowButtonUpFcn','ResizeFigure'); 2つ目 GetStartPoint.m function GetStartPoint global N_GLOBAL_A; N_GLOBAL_A=get(gcf,'CurrentPoint'); disp(N_GLOBAL_A); return; 3つ目 function ResizeFigure global N_GLOBAL_A Fsize=get(gcf,'position'); B=get(gcf,'CurrentPoint'); disp(B); NewFsize=abs(B-N_GLOBAL_A); h=findobj(gcf,'type','image'); C=get(h,'Cdata'); % disp(size(C)); Left=min(N_GLOBAL_A(1),B(1)); Right=max(N_GLOBAL_A(1),B(1)); Top=max(N_GLOBAL_A(2),B(2)); Bottom=min(N_GLOBAL_A(2),B(2)); newX=1:NewFsize(1); newY=1:NewFsize(2); newC=C(length(C(:,1))-(Top:-1:Bottom+1),Left+1:Right,:); set(h,'Xdata',newX,'Ydata',newY,'Cdata',newC); set(gca,'xlim',newX([1 end]),'Ylim',newY([1 end])); set(gcf,'Position',[Fsize([1 2])+[Left,Bottom],NewFsize]); return; これでtrim.mを実行すれば青地に赤い円がかかれた図が出てきて、 ドラッグ&ドロップをすればその範囲だけの画像になります。 ウィンドウズ環境でのドラッグ時のように点線の四角は出てきません。 また元に戻すこともできません。 (改良することができたらまた今度追加で書きます) それぞれで何をしているのか説明するのは非常に大変なので、 とりあえず動かして「ここは何をしているの?」という部分が 出てきたらorエラーが出たらその旨捕捉願います。 (4)uigetdirを引数なしで (A=uigetdirで)呼び出せば 私の環境ではAに絶対パスが入ったのですが…入りませんか? (5)(4)と併せてもいいですが、 絶対パスから書いてその後に\(ファイル名)とすれば指定のフォルダに保存されます。 カレントディレクトリ内のフォルダであれば hogehoge(フォルダ名)\hugahuga(ファイル名) でも構いません (そのフォルダがなければもちろんエラーが出ます) 以上、参考になれば幸いです。

forza1204
質問者

補足

Kulesさん いつもご返信ありがとうございます。 (1): 大変参考になりました!ありがとうございました。 (2): 本日の段階では動作する事を確認しました。 今後解析するにあたり、疑問点が出てきましたら記載させて頂きます。 (4): 「引数なし」がポイントでした(^^; A=uigetdir で絶対パスが入っている事が確認できました。 ありがとうございます。 (5): カレントディレクトリ内のフォルダを想定しています。 お手数ではございますが、サンプルスクリプトを記載して頂いてもよろしいでしょうか? また小出しになり恐縮ですが、先ほど質問(3)を公開しました(^^; お時間があります時に、ご確認して頂ければ幸いです。 http://oshiete1.goo.ne.jp/qa5744939.html

関連するQ&A