• 締切済み

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

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

    MATLAB初心者です。 現在、以下の環境を使っています。 ------------------------------- OS:Windows XP MATLABのバージョン:R2007a ------------------------------- 以下の内容をプログラムでどう組み込めばよいのか分らないため、質問させて頂きました。 詳しい方、ご教授のほどお願いします。 (1)Windowsのペイントで、ドラッグ&ドロップすると    +----------+    |         |    +----------+  このように、点線で枠ができると思います。それをMATLABで表現する方法  (始点座標と終点座標はマウスで操作するため、座標は可変になります) (2)MATLAB-GUIに画像データ(sample.tif)を表示する方法 (3)MATLAB-GUIを表示した時に、表示位置を常にパソコンのモニター中央にする方法 (4)MATLAB-GUIで画面A, Bとある場合、画面Aの[次へ]ボタンを押すと画面Aを消して画面Bを表示する方法 長くて申し訳ございませんが、ご回答よろしくお願いします。

  • MATLABについて質問です。

    MATLABについて質問です。 MATLABで読み込んだ画像の決まった範囲の領域の情報をマウスでドラッグして取得したいのですが、どのようにすればよいのでしょうか。 教えて頂けたらありがたいです。

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

    MATLAB初心者です。 いつもお世話になります。 現在、以下の環境を使っています。 ------------------------------- OS:Windows XP MATLABのバージョン:R2007a ------------------------------- 以下の内容をプログラムでどう組み込めばよいのか分らないため、質問させて頂きました。 詳しい方、ご教授のほどお願いします。 (1)カレントディレクトリ内のフォルダ(hoge)の中に「JPEGファイル」が何個あるかをカウントする方法 (2)MATLABの guide のプロパティ インスペクターの中に文字の水平位置(left, center, right)を設定する  「HorizontalAlignment」があると思います。  垂直位置を設定する箇所ってどこかにあるのでしょうか?  あれば、教えて頂きたいです。 (3)2つの画像ファイル「A.tif」「B.tif」を合成(論理和)して「C.tif」を出力する事って可能なのでしょうか?  色々と試してみましたが、今の自分の力量では無理でした。もし可能であれば、やり方を教えて頂きたいです。 全てでなくても、判る範囲までのご回答でもかまいません。 よろしくお願いします。

  • Matlab 2行の行列をプロットしたいのですが

    こんにちは、Matlabを使い始めのものです。 二行の行列(2x10とか2x40など)にについて、一行目をx座標、二行目をy座標としてグラフ化したいのですが、うまくいきません。 自動的にx座標は列の番号となり、二つのグラフが現れてしまいます:y座標に一行目、二行目、両方がプロットされてしまいます。どうにか、一行目をx、二行目をy座標としてグラフ化できないでしょうか。おそらく、とても単純なことなのかもしれないのですが、どうしてもわからず、とても歯がゆい思いをしています・・・。どうかご教示ください。 何をしたいかといいますと、音声データをMatlabで取り込んだのですが、振幅データがずらっと並んだ、1x500000とかの行列が得られます。 これを、プロットすると、x軸はサンプル番号が並ぶわけですが、本当はx軸は時間であって欲しいため、音声データの行列にひとつ行を足して、時間軸を作ってあげました。つまり、今手元にあるのは、2x500000の行列で、一行目が時間、二行目が振幅となっています。これをx軸が時間軸、でy軸が振幅となるようにグラフ化してあげたいと考えています。 文章がわかり辛くて申し訳ないのですが、何卒よろしくお願いします。

  • MATLABの質問です。

    MATLABについての質問です。 大学の研究していてMATLABでわからないところがあるのでぜひ教えて頂けたらと思っています。 よろしくお願い致します。 現在任意の多角形障害物を設置し,それらを回避する折れ線経路を全部求めるところまでできています。その後、全経路からダイクストラの方法で最短折れ線経路を求めたいのですがどのようにプログラムを持っていけばいいか分からず手詰まりしました。 ぜひご指導いただけますでしょうか。 よろしくお願いいたします。 プログラムは動きます。 close all; clc; init=1; final=1000; %図形座標取得 figure(1) for loop=init:final [x,y] = ginput A=[x,y] if 0<=x(:,:)&x(:,:)<=1&0<=y(:,:)&y(:,:)<=1 B{loop} =A else break end end % size(B{i},1) figure(2) for C=init:loop-1 B{C} fill(B{C}(:,1),B{C}(:,2),'g');hold on axis([0,1,0,1]); end [x,y] = ginput pb=[x,y] figure(3) for C=init:loop-1 fill(B{C}(:,1),B{C}(:,2),'g');hold on axis([0,1,0,1]); plot(pb(:,1),pb(:,2),'o');hold on axis([0,1,0,1]); end %図形の辺 k=0; for i=1:loop-1 for p=1:size(B{i},1) for q=p+1:size(B{i},1) k=k+1; obst(k,:) = [B{i}(p,:),B{i}(q,:)]; end end end Pall = pb(1, :); Pall = [Pall; cat(1, B{:})]; Pall = [Pall; pb(2, :)]; %全経路 k=0 for i=1:size(Pall,1) for j=i+1:size(Pall,1) k=k+1; path(k,:) = [Pall(i,:),Pall(j,:)]; point{k}=[i,j]; end end % 交差判定 H=0 for j=1:size(path,1) cflas=1 for i=1:size(obst,1) y1=((obst(i,1)-obst(i,3))*(path(j,2)-obst(i,2))+(obst(i,2)-obst(i,4))*(obst(i,1)-path(j,1))) y2=((obst(i,1)-obst(i,3))*(path(j,4)-obst(i,2))+(obst(i,2)-obst(i,4))*(obst(i,1)-path(j,3))) y3=((path(j,1)-path(j,3))*(obst(i,2)-path(j,2))+(path(j,2)-path(j,4))*(path(j,1)-obst(i,1))) y4=((path(j,1)-path(j,3))*(obst(i,4)-path(j,2))+(path(j,2)-path(j,4))*(path(j,1)-obst(i,3))) Y1=y1*y2 Y2=y3*y4 if Y1<0&&Y2<0 H=H+1 cflas=0 S{j}=[0,0,0,0] S1{j}=[0,0,0,0] end end if cflas==1 X=[path(j,1),path(j,3)]; Y=[path(j,2),path(j,4)]; Xa=[path(j,1),path(j,2)]; Yb=[path(j,3),path(j,4)]; S{j}=[X,Y] S1{j}=[Xa,Yb] plot(X,Y,'-');hold on end end barricade = length(B{1,1}); M=zeros %コストを計算 for k = 1:size(path,1) X1=S{k}(1,1); X2=S{k}(1,3); Y1=S{k}(1,2); Y2=S{k}(1,4); cost{k}=sqrt((X2-X1)^2+(Y2-Y1)^2) M(point{k}(1), point{k}(2) )=cost{k} % if cost{i}==0 % cost{i}=10 % end end M' g=cost{1} for j=1:size(obst,1)+1 if(cost{j}>cost{j+1}) g= cost{j+1} end end

  • matlabについて

    こんにちは。matlabについての質問です。 matlabについてまったくの初心者なのですが、大学のパソコンに入っているmatlabでsymsという変数の指定をしても、エラー表示がでてしまいます。これはどうやらmatlabに追加のtoolが入っていないと使えないということが調べていたらわかりました。この場合たとえば、f=x^2-x-1でf=0をxについて説くという場合どのようにmatlabに入力すればいいのですか?いろいろ調べたのですがよくわからなくて・・・。また、僕みたいな超初心者でもわかりやすいmatlab入門書やサイトで、お薦めの本などありましたら、教えていただきたいです。お願いします。

  • matlabでマウスで指定した任意の領域の情報取得したい

    matlabでマウスで指定した任意の領域の情報取得したい matlabで取り込んだ画像中の任意の領域をマウスのドラッグで範囲を指定し、その領域のデータを取得したいのですがどのようにすればよいのでしょうか? ちなみにMATLABのバージョンはR2009aです よろしくお願いします。

  • Matlabのcapture

    Matlabで,表示させたFigureのコピーを作成して,そのファイルを保存する操作を行うcaptureについての質問です.Matlab7.5.0(R2007b)を使っています. 下記サイトには参考コードとして [X,map] = capture(2); imwrite(X,map,'fig2.tif') がありました. しかしこの上の行のcapture(2)の2をFigure 1や単に1などに変更してみても(現在Figure 1を表示させているためです.), ??? 未定義の関数、またはメソッド 'capture' (タイプ'double' の入力引数)。 などというエラーが出てしまいます. どのような操作を行えば良いのでしょうか? どうぞよろしくお願いいたします. http://infoshako.sk.tsukuba.ac.jp/InfoRes/jdoc/MATLAB5/jhelp/techdoc/umg/umg.html http://infoshako.sk.tsukuba.ac.jp/InfoRes/jdoc/MATLAB5/jhelp/techdoc/umg/chprin31.html

  • MATLABのrbboxについての質問です。

    MATLABのrbboxについての質問です。 MATLABである画像の領域内の情報を取得できるようにしたいのですが、調べてみると、rbboxという関数を使って出来るらしいです。実際にMATLABのHPにあったソースコードを動かしてみると、画像にマウスでドラッグした領域の枠が描かれるのですが、その画像の領域をどうやって処理を行えるように出来るのかがわかりません。出来れば教えてほしいです。rbboxのソースコードを下に示します。宜しくお願いします。 figure; pcolor(peaks); k = waitforbuttonpress; point1 = get(gca,'CurrentPoint'); % ボタンダウンの検出 finalRect = rbbox; % figure単位の出力 point2 = get(gca,'CurrentPoint'); % ボタンアップの検出 point1 = point1(1,1:2); % x と y の抽出 point2 = point2(1,1:2); p1 = min(point1,point2); % 位置と大きさの計算 offset = abs(point1-point2); % x = [p1(1) p1(1)+offset(1) p1(1)+offset(1) p1(1) p1(1)]; y = [p1(2) p1(2) p1(2)+offset(2) p1(2)+offset(2) p1(2)]; hold on axis manual plot(x,y,'r','linewidth',5) % ボックスの回りに選択した領域の描画

  • MATLABでbodeコマンド(ラベル変えたい)

    MATLABについて質問です. MATLABを使ってボード線図を書いたのですが, bode()コマンドを使ったときにグラフのy軸ラベルを変える方法を教えてください. figureウインドウで右クリック→プロパティからラベルを変えることはできるのですが, これだとプログラムを再び実行すると最初の状態に上書きされてしまいます. なのでできればプログラム上でy軸ラベルを指定したいのですが, ゲイン特性と位相特性の二つのグラフそれぞれの軸を変える方法がわかりません. たとえばbode(A),ylabel('B') のようにするとなぜか位相特性のy軸ラベルが変わります. わかる方お願いしますm(_ _)m