Russian Qt Forum
Ноябрь 24, 2024, 21:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qwt. Отображение спектрограммы  (Прочитано 4409 раз)
Akon
Гость
« : Май 25, 2014, 19:09 »

Имеем QwtPlot и QwtPlotSpectrogram. По вертикали имеется порядка 4000 точек. Нужно отобразить горизонтальную линию шириной в 1 точку. Проблема в том, что она исчезает при отображении из-за того, что слишком тонкая. Какие могут быть предложения?
Записан
Akon
Гость
« Ответ #1 : Май 27, 2014, 07:45 »

Проблема, очевидно, в том, что при интерполяции эта линия исчезает. Тогда вопрос: какие известные методы интерполяции изображений можно применить в данном случае? Конечно, я могу легко придумать подходящий мне метод (и это скорее всего будет так), просто хочу знать что применяется в таких случаях, как это называется (терминология).
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Май 27, 2014, 08:26 »

Проблема, очевидно, в том, что при интерполяции эта линия исчезает.
Неясно что понимается под "интерполяцией" в данном случае. Я понял что высота 4K масштабится в гораздо меньшую (видимых пикселей), в результате тонкая линия исчезает. Теоретически на увеличение лучше всего bicubic, на уменьшение bilinear. Можно и по-народному: при уменьшении изображения задать большой вес данному цвету. Но все это подразумевает что Вы сами будете масштабить (из одного буфера пикселей в другой). Я бы с этим не связывался - проще отрисовать поверх или дать бОльшую толщину с учетом масштаба.
Записан
Akon
Гость
« Ответ #3 : Май 27, 2014, 10:48 »

Да, вы точно все поняли. Это все в контексте Qwt. Там есть класс QwtRasterMatrixData, который имеет два метода:    ResampleMode { NearestNeighbour, BilinearInterpolation }. Ни тот ни другой не работают (в смысле линия исчезает). Поэтому, я буду вынужден делать свой метод, который будет работать точно как вы сказали (с весом, "по-народному").

Если обрисовать задачу предметно, то, например, пусть имеем 10 точек {0 1 0 1 0 1 9 0 1 1} из которых формируется 1 пиксель экрана. Среднее значение равно 14, т.е. "средняя" интенсивность цвета пикселя равена 1.4. Т.е. 9-ка как бы "исчезает". Мне же нужно, используя нелинейный вес как функцию интенсивности цвета точки, получить, например, 8.5.

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

И еще вопрос, связанный с человеческим восприятием. Допустим имеем квадрат 10x10 пикселей:
0 1 0 1 0 1 9 0 1 1
0 1 0 1 0 1 9 0 1 1
...
0 1 0 1 0 1 9 0 1 1
С некоторого расстояния этот пиксель увидится как еле различимое пятнышко. Какой у него будет цвет?


Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Май 27, 2014, 14:19 »

Если обрисовать задачу предметно, то, например, пусть имеем 10 точек {0 1 0 1 0 1 9 0 1 1} из которых формируется 1 пиксель экрана. Среднее значение равно 14, т.е. "средняя" интенсивность цвета пикселя равена 1.4. Т.е. 9-ка как бы "исчезает". Мне же нужно, используя нелинейный вес как функцию интенсивности цвета точки, получить, например, 8.5.
Можно напр взять корень из суммы квадратов или просто поставить вместо 9 большое число - но попрет алиас. Если буфер на руках, то лучше "размазать" 9 в буфере по колокольчику, в результате напр {0 1 0 1 4 7 9 7 4 1} а затем пусть Qwt масштабит.

И еще вопрос, связанный с человеческим восприятием. Допустим имеем квадрат 10x10 пикселей:
0 1 0 1 0 1 9 0 1 1
0 1 0 1 0 1 9 0 1 1
...
0 1 0 1 0 1 9 0 1 1
С некоторого расстояния этот пиксель увидится как еле различимое пятнышко. Какой у него будет цвет?
Можно рассуждать так: с девяткой яркость 1.4, без нее 0.5. То есть девятка увеличила яркость почти в 3 раза

Инвертируем буфер 9, 8, 9, 8, 9, 8, 0, 9, 8, 8 = 0.76 яркость. А исходная 0.85. Т.е. нолик уменьшил яркость, но совсем ненамного (0.76 / 0.85).

Что подтверждается житейским опытом - белая линия на черном фоне смотрится ярко и жирно, а черная на белом - наоборот тонко
Записан
Akon
Гость
« Ответ #5 : Май 27, 2014, 16:01 »

Спасибо за разъяснение. 

Цитировать
то лучше "размазать" 9 в буфере по колокольчику
Да-да. Именно такие колокольчики меня и интересуют. Если не затруднит, можете поподробнее?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Май 27, 2014, 16:26 »

Да-да. Именно такие колокольчики меня и интересуют. Если не затруднит, можете поподробнее?
Я в таких случаях делаю так:

- задаю ширину полосы (напр 5 пикселей) и "хвостик" - напр 0.1 (это вес последнего размазанного, самый меньший). Форма колокола напр e ^ (k * x * x). Тогда находим k

х = 5 / 2 = 2.5   // половина полосы
0.1 = e ^ (k * x * x)
ln(0.1) = k * x * x
k = ln(0.1) / 6.25

И заполняю вектор весов для точек

  • = 1 (центр)
  • [1] = e ^ (k * 1 * 1)
    [2] = e ^ (k * 2 * 2)
    [3] = e ^ (k * 3 * 3)

    Можно еще др форму вместо квадрата, тогда k * x ^ n, но обычно в этом нет необходимости
Записан
Akon
Гость
« Ответ #7 : Май 27, 2014, 21:19 »

Спасибо, принял к сведению.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.072 секунд. Запросов: 23.