2013-04-08 3 views
1

spectrogram() 함수를 사용하여 일부 사운드 클립을 MATLAB에 분석 중입니다. 스펙트로 그램을 이미지 (jpg, png 등)로 저장하고 싶습니다. 하지만 어떤 그림 형식을 사용하든 그림을 저장하는 것과 관계없이 결과 이미지는 그림에서 보는 것과 항상 다르게 보입니다 ("반점"). 내가 원하는 건 정확히 내가 이미지로 그림에서 보는 것과 저장하는 것입니다 Matlab FigureSaved ImageSpectrogram을 MATLAB에 이미지로 저장

:

다음은 스펙트로 그램의 예입니다. 가능한 모든 이미지 형식으로 그림을 저장하려고 시도했지만 모두 동일한 "스포팅"효과를 내고 있습니다. 또한 수동 저장 (파일 저장 -> 다른 이름으로 저장 클릭)과 프로그래밍 방식으로 print()saveas() 기능을 사용하여 저장을 시도했습니다. 매번 같은 결과.

도움이 될 것입니다.

enter image description here

+0

나는 해결 방법 아래 게시 한하지만 문제의 뿌리를 찾을 수 없습니다했습니다. 누구나 시도하고 싶다면 여기에서 오디오 샘플을 찾을 수 있습니다 (http://eeninja.com/public/sample_clip.aiff). – shapeshifter

답변

0

본질적으로 회전 된 surf() 함수가 표 형식 (doc)으로 플롯 된 pcolor() 함수를 사용하여이 문제의 해결 방법을 발견했습니다. spectrogram() 함수로 더 많은 작업을 한 후에, 나는이 "스포팅"아티팩트가 데이터 포맷, 속성 또는 스케일과 아무런 관련이 없음을 확신합니다. 문제는 MATLAB이 3D 플롯을 플롯하고 시각화하는 방식에있는 것처럼 보입니다. 나는 mesh() 기능으로 음모를 꾸미려고했지만 다른 종류의 "스포팅"효과를 냈다. pcolor()은 3D 플롯의 2D 시각화이기 때문에 작동합니다.

spectrogram() 플롯 surf()를 사용하여 이미지합니다 (doc에서 적응) 방법입니다

[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'); 
1

당신의 스펙트로 그램의 데이터 범위는 무엇입니까? 당신의 스펙트로 그램 범위가 double 이미지의 경우 [0,1] 영역이거나 uint* 이미지의 경우 [0,255]입니다 (저장된 이미지의 흰색 점이 MatLab 그림의 로컬 최소 점에 가까울 수 있습니다).

또 다른 생각은 imwrite 기능, 특히 imwrite(X,map,filename,fmt) 구문을 사용하고있는 것 같습니다. 매트랩 문서 설명 :

imwrite는 (X는,지도, 파일 이름, FMT)는 X의 지정된 인덱스의 이미지를 작성하고 관련 컬러 맵지도는 FMT로 지정된 형식에서 파일 이름. X가 클래스 uint8 또는 uint16 인 경우 imwrite는 배열의 실제 값을 파일에 씁니다. X가 클래스 double이면 imwrite는 uint8 (X-1)을 사용하여 쓰기 전에 배열의 값을 오프셋합니다. map은 유효한 MATLAB 색상 표 여야합니다. 대부분의 이미지 파일 형식은 256 개 이상의 항목이있는 색상 표를 지원하지 않습니다.

따라서 uint8(X–1)은 흰색 반점의 원인 일 수 있습니다. print()을 보낸 이유가 무엇인지 모르지만.

+0

위에 표시된 이미지의 데이터 범위는 [0,1]로 두 배로 정규화됩니다. 그러나 스펙트로 그램 출력을 직접 플롯해도 결과 그림은 똑같습니다. 나는 어디에서나'imwrite()'함수를 사용하지 않는다. 'spectrogram()'함수에 대한 [documentation] (http://www.mathworks.com/help/signal/ref/spectrogram.html)은'surf()'함수가 이미지를 그리는 데 사용된다는 것을 보여줍니다. 수동으로 이미지를 그려 보았지만 저장 후 "스포팅"효과가 계속 발생합니다. – shapeshifter

0

흰 반점은 spectrogram()의 내부 호출 surf()에서 사용되는 렌더러 인 OpenGL 문제입니다.당신은 2D 시각화 음모를 꾸미고에 관심이 있기 때문에 는, z 버퍼에 현재의 모습에 대한 렌더링을 변경 :

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

"현재의 모습을 얻을". 흰 반점은 이제 없어졌습니다. 당신이 그림을 만들 때 또한 spectrogram()를 호출하기 전에, z 버퍼 렌더러를 선택할 수 있습니다

참고 :

myNewFig = figure('renderer','zbuffer');