3

MATLABspectrogram()の関数を使用して、いくつかのサウンド クリップを分析しています。スペクトログラムを画像 (jpg、png など) として保存したいと考えています。しかし、図を保存する画像形式に関係なく、結果の画像は常に、図に表示されているものとは異なります (「むら」)。

スペクトログラムの例を次に示します: Matlab Figure保存された画像

私が望むのは、図に表示されているものを正確に画像として保存することだけです。可能なすべての画像形式でフィギュアを保存しようとしましたが、それらはすべて同じ「スポッティング」効果を生み出しています。print()また、手動保存(ファイルをクリック->名前を付けて保存)と、関数と関数を使用したプログラムの両方を試しましたsaveas()。毎回同じ結果。

どんな助けでも大歓迎です!

ここに画像の説明を入力

4

3 に答える 3

1

スペクトログラムのデータ範囲は? 理由の 1 つは、スペクトログラムの範囲が画像の [0,1] 領域doubleまたは画像の [0,255]領域外にある可能性がありますuint*(保存された画像の白い点は、MatLab 図の極小値に疑わしいほど近いです)。

別の推測では、imwrite関数、特にそのimwrite(X,map,filename,fmt)構文を使用している可能性があります。MatLab のドキュメントでは、次のように説明されています。

imwrite(X,map,filename,fmt) は、X のインデックス付きイメージとそれに関連付けられたカラーマップ マップを fmt で指定された形式で filename に書き込みます。X がクラス uint8 または uint16 の場合、 imwrite は配列内の実際の値をファイルに書き込みます。X がクラス double の場合、imwrite は uint8(X–1) を使用して、書き込む前に配列内の値をオフセットします。map は有効な MATLAB カラーマップでなければなりません。ほとんどのイメージ ファイル形式は、256 を超えるエントリを持つカラーマップをサポートしていないことに注意してください。

それがuint8(X–1)白い斑点の原因かもしれません。print()'ing の後に表示される理由はわかりませんが。

于 2013-04-08T06:26:54.753 に答える
0

spectrogram()白い点は OpenGL の問題であり、の への内部呼び出しで使用されるレンダラーsurf()です。2D ビジュアライゼーションのプロットに関心があるため、現在の Figure のレンダラーを zbuffer に変更します。

set(gcf, 'renderer', 'zbuffer');

wheregcfは「現在の図を取得する」ことを意味します。白い斑点が消えました。

を呼び出す前に、Figure を作成するときに zbuffer レンダラーを選択することもできることに注意してくださいspectrogram()

myNewFig = figure('renderer','zbuffer');
于 2013-12-13T10:05:25.117 に答える
0

関数を使用することで、この問題の回避策を見つけました。これは、基本的にグリッド形式 ( docpcolor() ) でプロットされた回転関数です。関数をさらにいじってみると、これらの「スポット」アーティファクトは、データ形式、プロパティ、またはスケールとは何の関係もないことがわかりました。問題は、MATLAB が 3D プロットをプロットおよび視覚化する方法にあるようです。この関数でもプロットを試みたところ、別の種類の「スポッティング」効果が得られました。3D プロットの 2D ビジュアライゼーションであるため、機能します。surf()spectrogram()mesh()pcolor()

これは、( docから適応)spectrogram()を使用して画像をプロットする方法です:surf()

[S,T,F,P] = spectrogram(X,256,250,256,2000);
surf(T,F,abs(S),'EdgeColor','none');
axis tight; view(0,90);

...そして、これはpcolor()保存しやすい画像をプロットするために使用する方法です:

[S,T,F,P] = spectrogram(X,256,250,256,2000);
h = pcolor(T,F,abs(S));
set(h,'EdgeColor','none');
于 2013-04-10T06:36:08.167 に答える