2017-04-07 14 views
0

Matlabを使ってプロットから曲線を抽出したいと思います。抽出したいカーブの色を選択し、その座標を出力したいと思います。私はこれを相対グラフのために行うことは複雑であることを理解しています。したがって、必要なのはピクセル位置だけです。そこから私は彼らが何に対応しているか分析することができます。私は赤い曲線を取り、それらの場所をテキストファイルに出力したいというサンプル画像が提供されています。Matlabを使ってpngのプロットからデータを抽出する

Phonon Spectrum

これに非常に素敵な追加は、「カーブフィット」抽出された画素になります。抽出されたグラフの値は、数値データが幅を持つ+5ピクセルの幅の曲線から得られます。この挙動を平均化してデータを薄くすることが理想的です。

Data and Desired Data

赤青ではなく、抽出される有効画素であり、曲線上の画素です。私はこれが2つのやり方で行われていることを見ています:画像の変換、値の抽出、またはその逆。どちらがよかったかわからない。

+0

?私はイメージの一番上の行のすべての赤のピクセルを意味し、二番目の行の赤のピクセルはすべて続きます。 –

+0

@ MarkSetchell MATLABの列順です。 Captain Morganは、このグラフが 'Img(:、:、1)&〜Img(:、:、2)'でうまく動作するように見えます。あなたのグラフはすごく素敵なものになりますか? – beaker

+0

これはMatlabでも可能ですが、これが1回限りの作業であれば、Webアプリケーション "WebPlotDigitizer"を使用することをお勧めします。このWebアプリケーションでは、高度な精度で手動で行うことができます。あなたがMatlabで作った場合、交差する赤線はあなたの人生をはるかに複雑にします。 – brainkz

答えて

1

Mark Setchellとほぼ同じ解決策ですが、現在Matlabにあります。あなたは、彼らが走査線の順で出てくるだろう実現

I = imread('DoEvE.png'); 
% select the red pixels 
Ired = I(:,:,1) == 255 & I(:,:,2) == 0 & I(:,:,3) == 0; 
figure 
imshow(Ired) 
[x, y] = find(Ired); % extract the (x, y) coordinates of the red pixels 
hold on 
plot(y, x, 'b.'); % plot the result to validate 

enter image description here

+0

これは簡単に見える - 素晴らしい仕事! –

+0

ああ、うわー!これは私が思ったよりも簡単に見えます。どうもありがとうございました。 –

+0

これを拡張する次のステップは、これらの曲線を「幅」で離散データに変換することです。単純な変換がグラフの値に適合するように、所望の色のすべてのピクセルを有することは偉大であるが、データの曲線適合の一形態を行うことができることは驚くべきことである。 –

1

誰もMatlabメソッドを提供していないようですので、私はImageMagickに基づいたメソッドを提供しています。これはほとんどのLinuxディストリビューションにインストールされており、macOSとWindowsでは無料で利用できます。

ターミナル(Windowsのコマンドプロンプト)で次のコマンドを実行すると、画像が表示され、透明度をオフにして、redの10%以内にないすべてのピクセルを黒で塗りつぶします。

magick plot.png -alpha off -fuzz 10% -fill black +opaque red result.png 

enter image description here

我々は再びそのまったく同じことを行うが、その後の画像はこのようにテキストに変換する場合:

# ImageMagick pixel enumeration: 650,455,65535,srgb 
0,0: (0,0,0) #000000 black 
1,0: (0,0,0) #000000 black 
2,0: (0,0,0) #000000 black 
3,0: (0,0,0) #000000 black 
4,0: (0,0,0) #000000 black 
5,0: (0,0,0) #000000 black 
6,0: (0,0,0) #000000 black 
7,0: (0,0,0) #000000 black 
8,0: (0,0,0) #000000 black 
... 
... 
99,138: (65535,0,0) #FF0000 red 
100,138: (65535,0,0) #FF0000 red 
101,138: (65535,0,0) #FF0000 red 
102,138: (65535,0,0) #FF0000 red 
103,138: (65535,0,0) #FF0000 red 

magick plot.png -alpha off -fuzz 10% -fill black +opaque red txt: 

我々はこれを取得します同じことをやり直すと、今度は出力を解析して#FF0000(Windows上であなたはFINDSTR代わりのawkを使用する)だけ結腸に最初のフィールドを印刷する:

magick plot.png -alpha off -fuzz 10% -fill black +opaque red txt: | awk -F: '/#FF0000/{print $1}' 


99,138 
100,138 
101,138 
102,138 
103,138 
434,138 
439,138 
440,138 
... 
... 

MATLABを使用しているとして、あなたはImageMagickのにこのような何かを支払う必要があるでしょう:

[result,output]=system("magick plot.png -alpha off -fuzz 10% -fill black +opaque red txt: | awk -F: '/#FF0000/{print $1}'"); 

あなたは%記号をエスケープするには、Windows上でキャレット(^を)必要があるかもしれません。または、すべてのコマンドをBATCHファイルに入れて、それを頻繁に行うと入力を保存するように呼び出すことができます。

+0

私はこれが好きです。私はこれらのコマンドをf90に任意に投げ込み、exeを実行させることができます。 Matlab、私はfortranを使ってそれをどのように動作させるか分かりません。ありがとう! –

+0

あなたはそうすることができますが、@ m7913dの解決策ははるかに優雅です。私は彼のために投票している! –

関連する問題