Чтобы все пики были четко видны в Matlab

Я наконец решил свою проблему здесь с помощью < сильный> lennon310. У меня есть изображение тысяч тонких пиков на частотно-временном изображении. Я не могу все время видеть на одной картинке. В зависимости от физической ширины моего временного окна некоторые окна появляются, а некоторые становятся видимыми.

Изображения моих данных, которые я рисую imagesc

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Все изображения взяты из одних и тех же точек данных T, F, B.

Как в Matlab можно нанести сразу все пики на изображение?


person Léo Léopold Hertz 준영    schedule 31.12.2013    source источник
comment
Маси, я не совсем понимаю причину, по которой вы не можете изобразить все столбцы B на одной фигуре? Не могли бы вы сообщить мне, как вы построили три фигуры выше?   -  person lennon310    schedule 31.12.2013
comment
@ lennon310 Не хватает разрешения дисплея. Нам нужно другое ядро ​​фильтра для отображения, потому что разрешение ниже. Пожалуйста, смотрите ответы БенВойгта ниже. Эти изображения сделаны путем изменения ширины окна Matlab по горизонтали, когда изображение уже готово. Это показывает, что разрешения недостаточно, так как некоторые пики отображаются при выборе некоторого окна Matlab. Примеры данных здесь dl.dropboxusercontent.com/u / 62073194 /   -  person Léo Léopold Hertz 준영    schedule 01.01.2014
comment
@ lennon310 Изображение загружено. Я думаю, что у меня есть ошибки в расчетах. Я не могу сохранить пиксель родным, поэтому изображение не родное. Мне нужно разработать фильтр ядра для дистрибутива. Есть идеи, как это сделать? Частота дискретизации 360 Гц. Мой образец имеет длину около 13,892 секунды. Ядро - это нормализованная функция Sinc (vu).   -  person Léo Léopold Hertz 준영    schedule 01.01.2014


Ответы (7)


Вам необходимо изменить размер изображения с помощью повторной выборки, чтобы предотвратить эффект сглаживания (который Крейгим назвал неизбежным).

Например, функция MATLAB imresize может выполнять сглаживание. Не используйте «ближайший» метод изменения размера, это то, что у вас есть сейчас.

person Ben Voigt    schedule 31.12.2013
comment
Это то, что вы имеете в виду ниже? Теперь мне нужно реализовать свертку и фильтр ядра. У меня есть пики по осям Y и X. Должен ли я реализовать эту функцию * filter2 по осям X и Y? * Я думаю, что со сложной экспоненциальной функцией в направлении Y из-за дискретного преобразования Фурье, сделанного ранее . - person Léo Léopold Hertz 준영; 31.12.2013
comment
После того, как изображение было создано с использованием imagesc, информация с пиками уже была удалена и потеряна. Изменение размера с помощью imresize не вернет его. - person craigim; 01.01.2014
comment
Затем передайте в imagesc большие размеры, а затем измените размер с помощью imresize. Кажется, что изображенияc сосредоточены на цветовой гамме, а не на геометрическом масштабе. - person Ben Voigt; 01.01.2014
comment
@BenVoigt Пожалуйста, посмотрите мое расширение к вашему ответу ниже. Вы имеете в виду, что это фильтр ядра? Я только передавал значения данных через ядро. Я применил любой фильтр. Я еще нигде не использовал свертку, поэтому думаю, что фильтр ядра еще не готов. - person Léo Léopold Hertz 준영; 01.01.2014

Расширение ответа @BenVoigt

Моя попытка

B = abs(B);
F1 = filter2(B,T); % you need a different filter kernel because resolution is lower    
T = filter2(B,F);
F = F1;
image1 = imagesc(B);
display1 = imresize(image1, [600 600], 'bilinear');   
imshow(T*t, F*fs, display1); 

где какие-то проблемы.

Я снова получаю картинку, где не хватает разрешения

введите описание изображения здесь

person Community    schedule 31.12.2013
comment
Вы не указали новый размер для imresize, поэтому он ничего не сделал. Вызов display1 = imresize(image1, [width height], 'bilinear');, где width и height - размер графика (в пикселях). - person Ben Voigt; 31.12.2013
comment
Или вы можете изменить ядро ​​анализа, чтобы анализировать меньшее количество частотных диапазонов, которые соответствуют разрешению вашего экрана. Это зависит от того, будете ли вы выполнять другие операции с данными помимо их отображения. Если только отображение, обработайте меньше широких полос частот. Если вы выполняете другую обработку, то фильтруйте, используя исходное ядро, и используйте imresize, когда хотите его отобразить. - person Ben Voigt; 31.12.2013
comment
Я применил равномерную выборку, взяв каждую сотую точку. Разрешения все равно не хватает. Думаю, проблема в использовании функции imresize. - person Léo Léopold Hertz 준영; 31.12.2013
comment
Теперь вы просто выбрасываете данные, не делайте этого. Цель передискретизации - сохранить низкочастотную составляющую всех данных, а не только нескольких отсчетов. - person Ben Voigt; 31.12.2013
comment
Вернемся к дополнительной обработке данных и ничего не изменим, кроме того, что imshow(image1); становится display1 = imresize(image1, [600 600], 'bicubic'); imshow(display1); - person Ben Voigt; 31.12.2013
comment
@BenVoigt Я внес некоторые изменения. Порядок действий прямо сейчас? Разрешение по-прежнему остается проблемой. - person Léo Léopold Hertz 준영; 31.12.2013
comment
В отличие от ваших исходных изображений, теперь я вижу все ваши пики, но некоторые из них тусклые. Ты согласен? Возможно, следующим шагом будет увеличение яркости / контрастности. - person Ben Voigt; 31.12.2013
comment
Для регулировки контрастности см. mathworks.com/products/image/examples.html?file=/products/demos/ - person Ben Voigt; 31.12.2013

2-е расширение для ответа BenVoigt

Мое предложение для одного фильтра ядра - это свертка относительной случайной ошибки

data(find(data ~= 0)) = sin(pi .* data(find(data ~= 0))) ./ (pi*data(find(data ~= 0)));        
data(find(data == 0)) = 1; % removing lastly the discontinuity
data1 = data + 0.0000001 * mean(abs(data(:))) * randn(size(data));
data = conv(data, data1);

Это то, что BenVoigt имеет в виду под фильтром ядра для распределения?

Это дает такие результаты, как

введите описание изображения здесь

где разрешение все еще проблема. Центральные пики имеют тенденцию легко увеличиваться, если я изменяю размер окна.

У меня был активен старый код на картинке выше, но это не повлияло на результат. Приведенного выше кода по-прежнему недостаточно для фильтра ядра отображения. Возможно, некоторые функции фильтра необходимо применить к оси времени и частоты отдельно, что-то вроде:

F1 = filter2(B,T); % you need a different kernel filter because resolution is lower    
T = filter2(B,F);
F = F1;

Эти фильтры портят значения на обеих осях. Мне нужно лучше их понять, чтобы это исправить. Но сначала нужно понять, верны ли они.

Размер фигуры все еще изменен. Размер данных был 5001x1 двойной, а размер F и T - 13635x1 двойной. Поэтому я думаю, что мне следует изменить размер в последнюю очередь после установки оси, меток и заголовка с помощью

imresize(image, [13635 13635], 'bilinear');   

так как распределение билинейное.

person Community    schedule 01.01.2014
comment
Свертка, вероятно, работает недостаточно хорошо. Разрешение по-прежнему остается проблемой. - person Léo Léopold Hertz 준영; 01.01.2014
comment
Нет, не то, что я имел в виду. Передайте весь размер ваших f-t данных в imagesc, чтобы ничего не потерять. Это будет слишком велико для отображения, поэтому используйте imresize и размер отображения. - person Ben Voigt; 01.01.2014
comment
Нет необходимости добавлять относительную случайную ошибку к СКР и его свертке. Думаю, это только увеличивает мешающую массу раздачи. - person Léo Léopold Hertz 준영; 08.01.2014
comment
@BenVoigt Я добавил 4-е расширение. Вы имеете в виду как изображенияc ([0 numel (T)], [0 numel (F)], B, [0 numel (B)]) ;? - person Léo Léopold Hertz 준영; 08.01.2014

Третье расширение для ответа BenVoigt

Я рисую картину сейчас

imagesc([0 numel(T)], [0 numel(F)], B);              

У меня на фотографиях большая проблема с алиасингом. Вероятно, что-то вроде этого должно быть для манипулирования частотно-временным представлением.

T = filter2(B,t); % you need a different filter kernel because resolution is lower    
F = filter2(B,fs);
person Community    schedule 02.01.2014

4-е дополнение к ответу и комментарию БенВойгта

Убираю фильтры и добавление случайных относительных ошибок. Я установил размер T, F, B и запустил

imagesc([0 numel(T)], [0 numel(F)], B, [0 numel(B)])

Я все еще со значительным псевдонимом, но другая картина

введите описание изображения здесь

person Community    schedule 08.01.2014

Это не легкомыслие, но я думаю, что единственный способ - получить более широкий монитор с более высокой плотностью пикселей. MATLAB и ваша видеокарта могут отображать только определенное количество пикселей на экране и должны решить, какие из них показывать, а какие опускать. Данные все еще там, они просто не отображаются. Поскольку у вас много очень узких линий, некоторые из них будут пропущены при принятии решения о том, какие пиксели подсвечивать. Изменение размера временного окна приводит к изменению того, какие строки смещаются, а какие из них появляются на экране.

Мои предложения в произвольном порядке: сверните ваши линии с помощью гауссианы вдоль оси времени, чтобы расширить их, тем самым увеличивая вероятность того, что часть пика появится на экране. Распечатайте их на принтере с разрешением 600 dpi и посмотрите, появятся ли они. Сделайте несколько графиков, увеличивая каждый в отдельном временном окне.

person craigim    schedule 31.12.2013
comment
Это невозможное решение. Я не могу окно только по оси времени. Я должен сделать это и по оси частот. Окончательное изображение будет иметь пики по обеим осям. Так что, вероятно, мне следует выполнить то, что вы предлагаете, по обеим осям, но с учетом комплексной экспоненты на оси частот из-за дискретного преобразования Фурье. - person Léo Léopold Hertz 준영; 31.12.2013
comment
Когда я говорю увеличивать разные временные окна, я не говорю о реальной математике, а просто запускаю команду типа set(gca,'XLim',[0 4]) для отображения времени от 0 до 4 секунд. Промыть, повторить. - person craigim; 31.12.2013
comment
Отсутствие столбцов - не единственный способ отобразить изображение в меньшем окне просмотра. Существуют методы масштабирования, которые включают некоторую форму повторной выборки, и даже GDI предоставляет механизмы, которые объединяют столбцы с помощью побитовых операций И ​​или ИЛИ вместо прореживания. - person Ben Voigt; 31.12.2013
comment
Единственная часть этого ответа, которую я считаю стоящей, - это предложение свертки (независимо от того, является ли ядро ​​гауссовым или каким-либо другим фильтром нижних частот), которое является одним из обычных шагов при передискретизации изображения. - person Ben Voigt; 31.12.2013
comment
@BenVoigt Ядро - это нормализованная функция Sinc, как в распределении Вигнера-Вилля. - person Léo Léopold Hertz 준영; 31.12.2013
comment
@Masi: Это хорошо, но вам понадобится другое ядро ​​фильтра для отображения, потому что разрешение ниже. - person Ben Voigt; 31.12.2013
comment
@BenVoigt Пропуск столбцов - не единственный способ, но я считаю, что imscale это делает именно так. - person craigim; 01.01.2014
comment
Я не знаю, почему вы говорите о том, что видеокарта пропускает пиксели, когда на самом деле imagesc их удалил. - person Ben Voigt; 01.01.2014
comment
@BenVoigt Спасибо, что указали на это! Какую функцию следует использовать в Matlab, чтобы не пропускать пиксели? Я не нашел ни одной функции, которая принимает три параметра, например imagesc. - person Léo Léopold Hertz 준영; 02.01.2014
comment
@Masi: если вы скажете imagesc, насколько большим нужно сделать изображение, вместо того, чтобы позволить ему использовать размер монитора, я предполагаю, что он не выбрасывает данные. Результат будет слишком большим, поэтому вы будете использовать imresize, где вы можете управлять передискретизацией. - person Ben Voigt; 02.01.2014
comment
@BenVoigt Я добавил там расширение к вашему ответу в качестве ответа. Как определить imagesc размер изображения? Непосредственно в качестве аргумента списка для imagesc или imresize? - person Léo Léopold Hertz 준영; 02.01.2014
comment
@Masi: Вы читаете документацию по этим функциям? Это прямо здесь: imagesc(x,y,C) отображает C как изображение и определяет границы осей x и y с векторами x и y. Если x(1) > x(2) или y(1) > y(2), изображение переворачивается влево-вправо или вверх-вниз соответственно. Итак, звоните imagesc([0 numel(t)], [0 numel(f)], f_t_data) - person Ben Voigt; 02.01.2014
comment
@BenVoigt Спасибо, что позволили мне понять это! У меня очень большая проблема с алиасингом картинки, которая меня сильно смутила. Моя текущая команда - imagesc ([0 numel (T) / 1000], [0 numel (F) / 68], B); где много сглаживания, но значения на оси правильные. - person Léo Léopold Hertz 준영; 02.01.2014
comment
@Masi: если вы хотите уменьшить размер на 1000 и 68, сделайте это в отдельном вызове imresize. image1 = imagesc([0 numel(T)], [0 numel(F)], B); image1 = imresize(image1, [numel(T)/1000 numel(F)/68]); Так что нет алиасинга, а результат - желаемый размер. - person Ben Voigt; 02.01.2014
comment
позвольте нам продолжить это обсуждение в чате - person Ben Voigt; 02.01.2014
comment
Я знаю частоту fs и временной шаг t для оси. Проблема в том, чтобы применить это к картинке. Вероятно, следует использовать filter2, как в моем 3-м расширении к вашему ответу. - person Léo Léopold Hertz 준영; 02.01.2014
comment
Ну не знаю. Документация image разъясняет, чего imagesc не ... что диапазоны x и y влияют только на метки, а не на размер изображения. Так что это тупик. Может быть, imresize действительно стоит использовать до imagesc. - person Ben Voigt; 02.01.2014
comment
@Masi: Что такое size(B)? - person Ben Voigt; 02.01.2014
comment
size (B) дает ans = 101 13635. - person Léo Léopold Hertz 준영; 02.01.2014
comment
Распределение является билинейным, поэтому, вероятно, что-то вроде imagesc (imresize (B, [numel (T) numel (F)]), 'билинейный'); **. Я получаю сообщение об ошибке ** Должен быть указан масштаб или выходной размер. Я не уверен, как imagesc должен принимать выходные данные imresize. - person Léo Léopold Hertz 준영; 02.01.2014

Третье расширение для ответа BenVoigt

Моя попытка указать imagesc, насколько большим нужно сделать изображение, вместо того, чтобы позволить использовать размер монитора, чтобы он не терял данные.

imagesc(T*t, F*fs, B, [50 50]);           
% imagesc(T*t, F*fs, B');

% This must be last
imresize(image, 'bilinear', [64 30],);   

Я не уверен, где мне следует указать количество пикселей по оси x и оси y, либо в команде imagesc, либо imresize.

Как правильно изменить размер изображения здесь?

person Community    schedule 02.01.2014