• 締切済み

MATLABで画像のヒストグラムを表示させようとしています。

MATLABで画像のヒストグラムを表示させようとしています。 >> I=imread('img.tif'); >> imhist(I) ??? Undefined function or method 'imhist' for input arguments of type 'uint8'. というエラーが返ってくるのですが、どうしたらいいのでしょうか? >>

  • 科学
  • 回答数2
  • ありがとう数18

みんなの回答

  • masudaya
  • ベストアンサー率47% (250/524)
回答No.2

輝度ヒストグラムでよければ, Img=imread('img.tif') ImgGray=uint8(0.2989*double(Img(:,:,1))+0.5870*double(Img(:,:,2))+0.1140*double(Img(:,:,3))); [xsize,ysize]=size(ImgGray); hg=zeros(256,1); for j=1:xsize for k=1:ysize hg(ImgGray(j,k))=hg(ImgGray(j,k))+1; end end こんな感じで作れると思います. カラー画像とした場合で考えました.

  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

たんに、Image Processing Toolbox が入っていないだけなような

関連するQ&A

  • MATLAB error (mat2gray)

     私のパソコン(WindowsXP)には、MATLAB(Ver5.2)が入っています。しかし、今までMATLABを使ったことはほとんどなく、これから勉強していくつもりでいます。    あるインターネットサイトからあるバイナリデータをタウンロードしMATLABで読み込もうとしています。そのサイトには、読み込むためのサンプルプログラム(mファイル)も紹介されています。しかし、そのサンプルプロクラムで読もうとすると、  "Undefined function or variable 'mat2gray'." というエラー出ます。おそらくmat2grayという関数か変数が必要であるということだと思いますが、私はどうすればいいか全く分かりません。教えてください。

  • OpenCVを用いたヒストグラムの比較について

     現在画像の類似度を求めるために、OpenCV1.0を使って色のヒストグラムの距離を求めるということを行っております。OpenCVで公開されているヒストグラム間の距離のサンプルプログラムを使って行っているのですが、結果があまり芳しくないためいろいろ調べなおしたところ、減色処理、量子化というワードにたどり着きました。  しかし調べてみてもいまいち分からず、行き詰っているのが現状です。どなたか減色処理や量子化について詳しい人がおりましたら、是非回答のほうよろしくお願いします。以下がOpenCVのコードなのですが、どこの部分をどのように変えたらそれが実現できるのかも是非回答お願いいたします。 #include <cv.h> #include <highgui.h> #include <math.h> #include <stdio.h> int main (int argc, char **argv) { char text[16]; int i, hist_size = 256, sch = 0; float range_0[] = { 0, 256 }; float *ranges[] = { range_0 }; double tmp, dist = 0; IplImage *src_img1 = 0, *src_img2 = 0, *dst_img1[4] = { 0, 0, 0, 0 }, *dst_img2[4] = { 0, 0, 0, 0}; CvHistogram *hist1, *hist2; CvFont font; CvSize text_size; // (1)二枚の画像を読み込む.チャンネル数が等しくない場合は,終了 if (argc >= 3) { src_img1 = cvLoadImage (argv[1], CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); src_img2 = cvLoadImage (argv[2], CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); } if (src_img1 == 0 || src_img2 == 0) return -1; if (src_img1->nChannels != src_img2->nChannels) return -1; // (2)入力画像のチャンネル数分の画像領域を確保 sch = src_img1->nChannels; for (i = 0; i < sch; i++) { dst_img1[i] = cvCreateImage (cvSize (src_img1->width, src_img1->height), src_img1->depth, 1); dst_img2[i] = cvCreateImage (cvSize (src_img2->width, src_img2->height), src_img2->depth, 1); } // (3)ヒストグラム構造体を確保 hist1 = cvCreateHist (1, &hist_size, CV_HIST_ARRAY, ranges, 1); hist2 = cvCreateHist (1, &hist_size, CV_HIST_ARRAY, ranges, 1); // (4)入力画像がマルチチャンネルの場合,画像をチャンネル毎に分割 if (sch == 1) { cvCopy (src_img1, dst_img1[0], NULL); cvCopy (src_img2, dst_img2[0], NULL); } else { cvSplit (src_img1, dst_img1[0], dst_img1[1], dst_img1[2], dst_img1[3]); cvSplit (src_img2, dst_img2[0], dst_img2[1], dst_img2[2], dst_img2[3]); } // (5)ヒストグラムを計算,正規化して,距離を求める for (i = 0; i < sch; i++) { cvCalcHist (&dst_img1[i], hist1, 0, NULL); cvCalcHist (&dst_img2[i], hist2, 0, NULL); cvNormalizeHis

  • HPに複数の画像をクリックで切替えを設置したい

    http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12121066372 を参考に <html> <head> <script language="JavaScript"> function change(name) { var img = document.images[name]; for(var i = 1; i < arguments.length; i++) { if(img.src == arguments[i]) { img.src = ((arguments.length - 1) > i) ? arguments[i+1] : arguments[1]; break; } } } </script> </head> <body> <img src="no0.png" name="img1" onClick="change('img1','no0.png','no1.png','no2.png','no3.png','no4.png','no5.png')"><br> <img src="yes0.png" name="img1" onClick="change('img1','yes0.png','yes1.png','yes2.png','yes3.png','yes4.png','yes5.png')"><br> </body> </html> と入力してみた所、no0.pngは表示されるのですが、画像をクリックしてもno1.pngに 切り替わってくれません。どこがおかしいのでしょうか?

  • チェックボックスで画像を一括表示

    下記サイトを参照して、 「チェックボックスのON / OFFで画像を表示する」 「全てのチェックボックスのON / OFFを切り替える」 を組み合わせて、 「全てのチェックボックスのON / OFFを切り替えて画像の一括表示」をしたいのですが、全てのチェックボックスのON / OFFの切り替えはできるのですが、それに伴って画像の表示・非表示までは反応しませんでした。各チェックボックスのON / OFFでの画像の表示・非表示は可能です。 http://iswebmag.hp.infoseek.co.jp/sample163.html http://iswebmag.hp.infoseek.co.jp/sample164.html ▼htmlソースです。 <FORM name="f1"> <INPUT type=checkbox name="f1" onClick="show(0,'img01')">朝焼に輝く星<BR> <INPUT type=checkbox name="f1" onClick="show(1,'img02')">木立の隙間から<BR> <INPUT type=checkbox name="f1" onClick="show(2,'img03')">夜明け<BR> <INPUT type=checkbox name="f1" onClick="show(3,'img04')">自転を感じる<BR> <INPUT type=checkbox name="f1" onClick="show(4,'img05')">昼の星空<BR> <INPUT type=checkbox name="f1" onClick="show(5,'img06')">砂丘の月<BR> <INPUT type=checkbox name="f1" onClick="show(6,'img07')">月の軌跡<BR> <INPUT type=checkbox name="f1" onClick="show(7,'img08')">彗星の飛来<BR> <INPUT type=checkbox name="f1" onClick="show(8,'img09')">彗星 <BR> <INPUT type=button value="全てOn" onClick="all_on(this.form.f1)"> <INPUT type=button value="全てOff" onClick="all_off(this.form.f1)"> </FORM> ▼チェックボックスのON / OFFで画像を表示するJavaScript <SCRIPT language="JavaScript"> <!-- function show(c,img){ if(document.f1.elements[c].checked == true){ document.getElementById(img).style.width=200; } else { document.getElementById(img).style.width=0; } } // --> </SCRIPT> ▼全てのチェックボックスのON / OFFを切り替えるJavaScript <SCRIPT language="JavaScript"> <!-- function all_on(chk){ for (i = 0; i < chk.length; i++) { chk[i].checked = true; } } function all_off(chk){ for (i = 0; i < chk.length; i++) { chk[i].checked = false; } } // --> </SCRIPT>

  • 特定の文字列で連結して返す関数

    String.prototype.connect=function(){ var connectString=this,text=''; foreach(arguments,function(){ //for(var i in arguments){}とfor(i=0;i<i.length;i++){}を使い分けされています if(text){ text+=connectString; } text+=this; }); return text; }; このように、thisに指定された文字列で、引数にある文字列を連結する関数を作ったのですが、 例: ' - '.connect('a','b','c'); ->a - b - c 配列などを渡した場合も表示したいのですが、typeof this=='object'で確認し、foreach(this,function(){/*~*/}); だと、その配列の中に更に配列がある場合、もう一度チェックし、foreachをやらなければなりません。 これではキリがないので、どうしたらいいでしょうか? arguments.calleeや、whileなどでどうにかしようと思いましたが、難しくて出来ませんでした>< やりたいことは、こうです↓ 'or'.connect('あ',['い',['う','え','お'],'か',['き'],['く','け'],'こ','さ'],'し','す','せ',[[['そ']][['た','ち','つ','て','と']]]); ->あorいorうorえorおorかorきorくorけorこorさorしorすorせorそorたorちorつorてorと 複雑かもしれませんが、お力をお貸しくださいm(_ _)m

  • 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の画像処理に詳しい方がいたら応答よろしくおねがいします。

  • スマホサイトでの画像をPOST

    スマホサイトで画像アップロードのフォームを作成しています。 5つほど添付できるようにしています。 form.php <form action="./send.php" method="post" enctype="multipart/form-data" novalidate="novalidate"> 画像<br> <?php for($i = 1; $i <= 5; $i++) { echo '<input type="hidden" name="item_img_name[' .$i. ']" value="' .$_SESSION['item_img_name'][$i]. '">'."\n"; echo '<input type="file" name="item_img[' .$i. ']" id="item_img_' .$i. '" value=""><br>'."\n"; } ?> <input type="submit" value="送信"> </form> 以上の内容でフォームを作成しております。 問題なのが、サブミットした際send.phpに切り替わるのがかなり遅く大変困っています。 1つにつき2MGの画像サイズを早くPOSTさせる方法はありませんでしょうか。

    • 締切済み
    • PHP
  • ヒストグラム均等化処理プログラム

    どなたか以下のヒストグラム均等化処理プログラムを解説して頂けないでしょうか。特にgetMinMax関数とgetHistEqu関数で、何がしたいのか訳がわかりません。 以下のプログラムは、ヒストグラム均等化処理部分のみですが、分かる範囲でいいので、解説お願いします。 ------------------------------------------------------- // ヒストグラム均等化による画素値の割り当てを決定する // hist :入力画像のヒストグラム // min :割り当てられる画素値の最小 // max :割り当てられる画素値の最大 // たとえば,min[5]=4 max[5]=6の場合,画素値5には4-6の範囲に割り当てられる // pixs_min :最小値が割り当てられる画素数 // pixs_max :最大値が割り当てられる画素数 // ave :各画素値に割り当てられる画素数 //★★特にmin,max,pixs_min,pixs_maxの説明の意味が分からないのです。 int getMinMax(int *hist,int *min,int *max,int *pixs_min,int *pixs_max,int ave) { int i; int rest; int now; int pixels; int a,b; rest=0; now=0; for(i=0;i<256;i++) { pixels=rest+hist[i]; min[i]=now; if(rest>0) pixs_min[i]=ave-rest; else pixs_min[i]=ave+100; a=pixels/ave; rest=pixels%ave; max[i]=now+a; if(rest>0) pixs_max[i]=rest; else pixs_max[i]=ave+100; now+=a; } for(i=0;i<255;i++) { if(min[i]>255) min[i]=255; if(max[i]>255) max[i]=255; } max[255]=255; pixs_max[255]=ave*10; } // ヒストグラム均等化による画素値の決定 // 割り当てられる画素値の最小,最大の間で順番に割り当てていく // ただし,最小,最大については割り当てる画素数に制限がある int getHistEqu(int x,int *now,int *min,int *max,int *pix_min,int *pix_max) { int res; if(now[x]==max[x]) { if(pix_max[x]<=0) now[x]=min[x]; else pix_max[x]--; } if(now[x]==min[x]) { if(pix_min[x]<=0) now[x]=min[x]+1; else pix_min[x]--; } if(now[x]>max[x]) now[x]=min[x]; res=now[x]; now[x]++; return res; } int effect(ImageData *img,ImageData *outimg) { int x,y; int rr,gg,bb; int ro,go,bo; int i; int val; int ave; int histR[256],histG[256],histB[256]; // ヒストグラム int omaxR[256],omaxG[256],omaxB[256]; // 変換後,割り当てられる画素値の最小 int ominR[256],ominG[256],ominB[256]; // 変換後,割り当てられる画素値の最大 int pix_maxR[256],pix_maxG[256],pix_maxB[256]; // 最小値が割り当てられる画素数 int pix_minR[256],pix_minG[256],pix_minB[256]; // 最大値が割り当てられる画素数 int onowR[256],onowG[256],onowB[256]; // 次に割り当てる画素値 Pixel pix; for(i=0;i<256;i++) { histR[i]=histG[i]=histB[i]=0; } ave= img->height * img->width /256; // 画像の全画素数/画素値の範囲 // ヒストグラム作成 for(y=0;y<img->height;y++) { for(x=0;x<img->width;x++) { getPixel(img,x,y,&pix); //画像上の画素情報を取得 rr=pix.r; gg=pix.g; bb=pix.b; histR[rr]++; histG[gg]++; histB[bb]++; } } // 画素値の割り当て決定 getMinMax(histR,ominR,omaxR,pix_minR,pix_maxR,ave); getMinMax(histG,ominG,omaxG,pix_minG,pix_maxG,ave); getMinMax(histB,ominB,omaxB,pix_minB,pix_maxB,ave); for(i=0;i<256;i++) { onowR[i]=ominR[i]; onowG[i]=ominG[i]; onowB[i]=ominB[i]; } // ヒストグラム均等化処理 for(y=0;y<img->height;y++) { for(x=0;x<img->width;x++) { getPixel(img,x,y,&pix); //画像上の画素情報を取得 ro=pix.r; go=pix.g; bo=pix.b; rr=getHistEqu(ro,onowR,ominR,omaxR,pix_minR,pix_maxR); gg=getHistEqu(go,onowG,ominG,omaxG,pix_minG,pix_maxG); bb=getHistEqu(bo,onowB,ominB,omaxB,pix_minB,pix_maxB); pix.r=rr; pix.g=gg; pix.b=bb; setPixel(outimg,x,y,&pix); // 画像に値をセットする } } return 0; }

  • デジカメ画像の一覧表示&印刷での欠番処理

    最近デジカメ買いました。取った画像をB4サイズに8枚まとめて印刷させようと思い、IE(限定可)でページに画像を割り振ってHTMLをつくりSDカードにコピーしておけばお手軽!と思ったのですが、その場で確認して消す画像があるため、どうしても欠番が生じます。 画像が存在しなかった場合の処理はどのようにすればよろしいのでしょうか? <!-- saved from url=(0014)about:internet --> <html> <head> <style> .ph img { width:123mm; height:82mm; } @media print { .noprt { display:none; } } </style> <script> function view(){ st =parseInt($V('fn1'),10); sl =$V('fn1').length; ct = 8; for(i=0;i<ct;i++){ sf = $V('fn0')+$0NUM(st+i,sl)+$V('fn2'); $('p'+i).src = sf; } } function $(o){ return document.getElementById(o)} function $V(o){ return document.getElementById(o).value} function $0NUM( num, p ){ var s = '0000000000'+ num; return s.substr( s.length-p,p); } </script> </head> <body> <div class="noprt"> Photo name: <input type="text" size="10" value="IMG_" id="fn0"> <input type="text" size="10" value="1000" id="fn1"> <input type="text" size="10" value=".JPG" id="fn2"> <input type="button" value="Photo View" onClick="view()"> </div> <div class="ph"> <img src="" id="p0"><img src="" id="p1"><br/> <img src="" id="p2"><img src="" id="p3"><br/> <img src="" id="p4"><img src="" id="p5"><br/> <img src="" id="p6"><img src="" id="p7"><br/> </div> </body> </html>

  • MATLABで外れ値をプロットする方法を教えてくだ

     MATLABで外れ値をプロットする方法を教えてください。  具体的には下記のとおりです。  MATLABで、中央値+中央値から±20%離れた時系列データをプロットするにはどうすればよいでしょうか? 冗長なprogramしか作成できないため、よい関数か、方法があれば教えていただきたく思い、 質問しました。 まず、時系列データですが、数十万点数からなる信号になっています。 この信号の中央値をだし、その中央値から±20%の範囲でひっかかるデータをplotしたく思っています。 中央値算出は、関数を知っていますので処理が早いのですが中央値から±20%の範囲でひっかかるデータをプロットするのにいまは、以下のような考えで行っています。 行データ、size(x(:)) ans=:1000000 1とおきます。 まず、 1)中央値を求める。 2)median+20%、median-20%を求める。 3) hold on;  for i=1:1:data-length   if(x(i)<=median-20% & x(i)>=median+20%) plot x(i) endif  end というようにしています。しかし、これではデータ一点一点検討する必要があるので冗長で、処理に時間が かかります。 そのため、for文を使わずに、 medi-20(:)=function(x(:),median-20) medi+20(:)=function(x(:),median+20) で計算できるような、関数functionを教えていただけると幸いです。 よろしくお願いします。