сохранить спектрограмму в виде файла - PullRequest
1 голос
/ 19 сентября 2019

Я использовал функцию spectrogram в MATLAB, чтобы сгенерировать спектрограмму и сохранить ее непосредственно в виде файла.Затем я использовал тот же wav-файл и тот же способ для генерации другой спектрограммы.Но сначала я сохранил его как файл jpg, а файл jpg сохранил как файл mat.Меня смущает, почему размеры матриц в двух файлах матов различаются: первый - 147*257 double, а второй - 256*256*3 uint8.

%% the first one
[x,fs] = audioread('1.wav')
spectrogram(x, window, L, N, fs);
set(gcf, 'position', [500,500,205,205]);
set(gca, 'Position', [0 0 1 1]);
f = getframe(gcf);
mat = getimage(gcf);
save(['D:\matlab\speech\', strcat(int2str(i)), '.mat'], 'mat', '-v6');

%% the second one
[x,fs] = audioread('1.wav')
spectrogram(x, window, L, N, fs);
set(gcf,'position', [500,500,205,205]);
set(gca,'Position', [0 0 1 1]);
f = getframe(gcf);
mat = getimage(gcf);
imwrite(f.cdata, ['D:\matlab\speech\', int2str(i),'.jpg']); 
img_A = imread(fullfile(file_path, strcat(int2str(i), '.jpg')))
save(['D:\matlab\speech\',strcat(int2str(i)), '.mat'], 'img_A', '-v6');

Кто-нибудь знает, почему это происходит??Как правильно сохранить спектрограмму в виде файла мата?

1 Ответ

1 голос
/ 19 сентября 2019

f.cdata матрица больше, потому что она включает в себя поля рисунка.

В соответствии с getframe документацией :

getframe
Захватывать оси или фигуры в виде кадров фильма

F = getframe (рис.) фиксирует фигуру, обозначенную на рис.Укажите фигуру, если вы хотите захватить всю внутреннюю часть окна фигуры, включая заголовок осей, метки и метки.Снятый кадр фильма не включает меню рисунков и панели инструментов.

Пример:

I = imread('peppers.png'); %Matrix size of I: 384 x 512 x 3
I = im2double(I); %Convert I from uint8 to double (result pixel range is [0, 1]).
figure;
imshow(I);
f = getframe(gcf);
mat = getimage(gcf); %Matrix size of mat: 384 x 512 x 3 and class(mat) is double.
fprintf('size(mat) = %d x %d x %d, class(mat) = %s\n', size(mat), class(mat)); % 384 x 512 x 3, class is double
fprintf('size(f.cdata) = %d x %d x %d, class(f.cdata) = %s\n', size(f.cdata), class(f.cdata)); % 479 x 664 x 3 (include margins), class is uint8.
figure;
imshow(f.cdata);

imwrite(mat, 'mat.jpg'); % 384 x 512 x 3 (double)
imwrite(f.cdata, 'f_cdata.jpg'); % 479 x 664 x 3 (uint8)

mat:
enter image description here

f.cdata:
enter image description here

Как видите, размер f.cdata больше mat из-за полейfigure.
В вашем случае тип данных изображения спектрограммы mat равен double, а тип f.cdata ("изображение кадра") равен uint8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...