• 締切済み

MATLABで連続した画像の取り込み方

1つのJPGファイルを取り込み、表示させるやり方は I = imread('sample000.jpg'); imshow(I) これででき、作業を書くと for t=1:1:10 if(t==1) A=imread('sample000.jpg'); imshow(A) hold on [xa, ya]=textread('sample01.txt','%d %d','headerlines',10); end plot(xa(t,1), ya(t,1), 'r+'); if(t==10) hold off end end ということになります。 10回ループさせるのは、sample01.txtの10行目以降の中身が10個ずつの座標だからです 以下はsample01.txtの中身を簡単に書いたものです ...         ※9行目 test coordinates  ※10行目 44 54        ※11行目 45 46 53 43 55 41 58 38 61 33 66 36 69 41 72 47 73 52        ※20行目 10         ※21行目 46 54        ※22行目 48 52 ... ... 77 51        ※31行目 10         ※32行目 47 52        ※33行目 ... ... という感じです。 で、本題ですが sample000.jpg sample001.jpg sample002.jpg ... ... など複数のjpgファイルをループを使って連続して取り込み、作業したいときは、どういうコマンドでどういうループを作ればいいでしょうか? 具体的には 1枚目のsample000.jpgファイルを読み込みhold on、sample01.txtの11行目から20行目の座標を赤い点でプロットし、最後にhold off 2枚目のsample001.jpgファイルを読み込みhold on、sample01.txtの22行目から31行目の座標を赤い点でプロットし、最後にhold off 3枚目の... というループです。 下手な説明でごめんなさい、誰かMATLABの画像処理に詳しい方がいたら応答よろしくおねがいします。

みんなの回答

  • kirinoma
  • ベストアンサー率53% (288/542)
回答No.2

#1です. 9行目が間違いでした. × plot(xa(plotCounter+jpegCounter*11,1), ya(plotCounter,1), 'r+'); ○ plot(xa(plotCounter+jpegCounter*11,1), ya(plotCounter+jpegCounter*11,1), 'r+'); 失礼しました.

  • kirinoma
  • ベストアンサー率53% (288/542)
回答No.1

こんにちは. ご質問の状況の場合,ループの中でsprintf関数を使用して,連番ファイル名を生成すれば良いでしょう. sprintf文の中の「%0?d」は?-1桁以下の数値変換の場合,頭に「0」を補完してくれる指示です. (sprintf関数の詳細についてはヘルプを参照,もしくはコマンドライン上で「help sprintf」してください) [xa, ya]=textread('sample01.txt','%d %d','headerlines',10); for jpegCounter = 0:1:5  str = sprintf('sample%03d.jpg',jpegCounter);  A = imread(str);  imshow(A);  hold on  for plotCounter = 1:1:10   plot(xa(plotCounter+jpegCounter*11,1), ya(plotCounter,1), 'r+');  end  hold off end (※デバッグはしていないので,このままでは動かない可能性大です 特にテキストのフォーマットがよく分からなかったので,そこは考慮していません. とりあえず動かなかったらtextreadとplotを外して,ちゃんと連番jpegが読めていることだけ確認してください) 後,細かいことですが,ループの中に入れるべき物,出すべき物はきちんと考えた方がよいです. imread・imshowをプロットと同じループの中に入れて最初の一回目かif文で判定するぐらいなら, ループの前に持ってきた方がよいです. 以上,参考になれば幸いです.

関連するQ&A

  • MATLABのplot結果を配列にいれたくて困っています。

    こんにちは。 画像の特徴点xy座標50個をplotし、それぞれの点を線で結んだ結果を画像の配列として扱いたいのですが、現在は a : 50x2(512x512の画像の特徴点の座標) imshow(Img) > hold on > line or plot(a(:,1),a(:,2)) だと、結果を512x512配列として扱えません。 点と点を直線で結んでいくような関数などありましたらよろしくお願いします。

  • MATLABでのエッジ強度画像の出力と保存

    MATLABで画像処理を行ない,対象とする画像(添付のcell.jpg)の勾配強度画像を得たいと思っております.ただし,その保存がうまくいきません. プログラムは,下記のコードを利用しました. im = imread('C:/work/cell.jpg'); im = rgb2gray(im); %メディアンフィルタで平滑化 J = medfilt2(im); figure(1) imshow(J) %勾配強度画像を求める hy = fspecial('sobel'); hx = hy'; Iy = imfilter(double(J), hy, 'replicate'); Ix = imfilter(double(J), hx, 'replicate'); gradmag = sqrt(Ix.^2 + Iy.^2); %figure, imshow(gradmag,[]), title('Gradient magnitude (gradmag)') imshow(gradmag,[]) 上記のプログラムで正しくエッジ強度画像は出力されるのですが,問題はそれを保存するときです. 「imwrite(gradmag, 'C:/work/cell_grad.jpg','jpg')」 のように保存すると,添付ファイルのようになってしまいます. どのようにしたら解決できますでしょうか. どなたかお分かりになる方がいらっしゃいましたら,ご教示お願い致します.

  • matlabで動画保存したい

    1次元の偏微分方程式の解を格納した uという100×Nの行列があるのですが, このuの1行目から最後の行までのそれぞれの行ベクトルを 順に表示させたいと考えています. つまり,アニメーションのように時間発展を表示させたいと考えています. (今までは単にwaterfallなどを使って表示していました) そこで,以下のように試してみました. >>hold on; M = moviein(100); for j = 1:100 waterfall(u(j,:)); view([44 62]); M(:,j) = getframe; end hold off; >> movie(M) としてみたところ,正常にアニメーションが表示されました. 次に >> movie2avi(M,'sample.avi') として,aviファイルとしてアニメーションを保存したのですが, 保存されたファイルを再生してみると,ファイルが斜めいたりしており, 正常にアウトプットされていませんでした. 上手く保存するやり方をご存知の方,ご教授ください.

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

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

  • 【Matlab】画像として保存するとplot3による点が消えてしまう

    【Matlab】画像として保存するとplot3による点が消えてしまう ----------------------------------------------------------------------------------- 最近Matlabを使用し始めた初心者です。よろしくお願いします。 surf出力とplot3による点が見える形で画像を出力したいと思っています。 画像はグラフを真下からのぞいたものとし、自動的に保存したいです。 自分の稚拙なプログラムではどうしてもプロットによる点が現れません。 対策をご教授いただきたいです。 プログラムの内容は、 二次元データをcsvから読み込み、surfで出力、 またデータ上のある座標での出力をplot3で点として表示するという流れを意図しています。 'Figure'ウィンドウ上(.fig)ではplot3で出力された点が表示されるのですが 画像(bmp,tiffで出力してみました)として出力した場合その点が消えてしまいます。 mファイルのプログラム、環境は以下のようになっています。 function test_show_graph(csvfilename) %------------------------------------ z = csvread(csvfilename); [height, width] = size(z); [x,y] = meshgrid(0:0.1:(height*0.1)); h_surf = surf(x,y,z); hold on zi = interp2(x,y,z,4,4, 'cubic'); plot3(4.0,4.0,zi+10,'.r','MarkerSize',30); plot3(4.0,4.0,zi-10,'.r','MarkerSize',30); hold off view([0, -90]); saveas(h_surf, 'test', 'tiff'); %Matlab&Simulink R2008a %WindowsVista SP1 %Dell StuioXPS(Intel Core i7) surfの表面に隠れて点か見えなくなっていると思い、 表面の上下に突き抜けるようにlineを出力してみたりしてみましたがダメでした。 駄文となり申し訳ありません。 皆様の知識をお借りできれば幸いです。

  • MATLABの極座標を用いたアニメーション

    MATLABを用いて極座標表示するpolarとpauseを用いて簡易的なアニメーションを作っています。その際、半径RHOの大きさによって、軸のスケールが変わってしまい、どうしても見づらくなってしまいます。 plotをaxisでスケールを固定するような操作を、polarの場合はどのようにして行うことが出来るか、ご存知の方は教えてください。 以下に例を示しておきます。 t = 0:.01:2*pi; for n=1:50 A=polar(t,n*sin(2*t).*cos(2*t)); caxis([0 50]) pause(0.01) end

  • matlabのエラー

    座標データが書き込まれたテキストファイルからデータをmatlabで読み込みたいのですが,作成したスクリプトでエラーが出ます.テキストファイルの形式はx,y,z座標がスペース区切りで1行ごとに書き込まれてます.以下作成したスクリプトです. path='coordinate.txt'; fid=fopen(path,'rt'); while feof(fid)==0 Line=fgets(fid); zahyou=sscanf(Line,'%f%f%f'); x(i)=zahyou(1); y(i)=zahyou(2); z(i)=zahyou(3); end fclose(fid); これを実行すると次のエラーメッセージが出ます. Attempted to access (1); index out of bounds because numel(zahyou)=0. エラーが出てるのはx(i)=zahyou(1)で,何がいけないのかさっぱりわかりません. さらにわからないことに,whileをなくして,一番最初の一行だけ読むときは,普通に動きます. 何がいけないのでしょうか.

  • MATLABのファイル読み込みに関して

    こんにちは,今回MATLABでのファイル読み込みに関して質問したいことがあり書き込みました 現在in_1-C110.txt,in_1-C120.txt,......in_1-C190.txt'というファイルがあり,これらのファイルをまとめて読み込もうとして以下のようなコードを記述しました for a=1:9 %ファイルを読む fin=fopen(['in_1-C1' a '0.txt'],'r');     %a A=fscanf(fin,'%f %f %f %f %f %f %f',[7 inf]); fclose(fin); (略) end このように,ファイル名の最初と最後は共通なので,異なる部分のみをループさせて連続して読もうとしています ところが,この方法だとInvalid fid.と出てしまいます 調べてみると、意図したものでは%aのところが in_1-C110.txt in_1-C120.txt となるはずだったのですが,fscanfを抜いてこのファイル名のところだけ書き出すようにしてみると in_1-C1(変な文字)0.txt in_1-C1(変な文字)0.txt といったような変数の部分が文字化けを起こしていることがわかりました. したがって,ファイルが読めない原因がこれにあるのだと推察したのですが,解決方法がまったくわからない状態です この問題を解決する方法がわかる方がおられましたら,教えていただけないでしょうか?

  • matlabでの改行文字について

    matlabでのテキストファイルの書き換えを行いたいのですが,改行文字の検出ができません.(C言語では作れますが,matlabで作りたいのです.) 例として以下のファイル(read.txt)の書き換えの方法を教えてください. start 0 1 2 abcdef 0 1 2 3 4 xyz end 上のファイルにおいて,abcdef以下の01234を他のファイルに書き換えたく,以下のスクリプトを作成しました. Path1='read.txt'; Path2='write.txt'; judge=0; Fid1=fopen(Path1,'rt'); Fid2=fopen(Path2,'wt'); while feof(Fid1)==0 Line=fgets(Fid1); if Line=='\n' judge=0; elseif judge==1 fprintf(Fid2,'%s',Line); end if strcmp(Line,'abcdef\n')==1 judge=1; end end fclose(Fid1); fclose(Fid2); end ここで,知りたいのは「Line=='\n'」と「strcmp(Line,'abcdef\n')==1」の条件文がうまく働いてない理由です.これを実行すると何も書かれてないファイルが作成されます. strncmp(Line,'abcdef',6)とするとこちらはうまく認識しますが,改行文字のみの行の検出はどのようにして行えばよいのでしょうか.

  • ファイルから文字を読みとる。

    JAVAを勉強中でファイル入出力で困っているので教えて下さい。 あるファイル(sample.txt)があるとします。 [sample.txt] (0,0) (10,20) このファイルは(x座標,y座標)のフォーマットで1行に1座標が書き込まれているとします。 ここからx座標、y座標をそれぞれ変数x,yに代入することはできるのでしょうか? C言語だと ("%d,%d",&x,&y)のような形でそれぞれ読み書きできたと思うのですが、 while((x_data = input.readLine()) != null){  y_data = input.readLine();  area_data.addElement(new Area(x_data,y_data)); } というかたちで 0 0 10 20 と1行に1文字ずつしか読み書きできません。 ご存じの方は是非教えて下さい。 また、JAVAを勉強するためのおすすめサイト、書籍がありましたら教えて下さい。