Страница 1 из 1

Нужен совет по медианному фильтру в разных программах

Добавлено: 21 июн 2018, 23:34
Sagrer
Здравствуйте.
Я пока плохо разбираюсь в ГИС, поэтому обращаюсь за советом на форум :).

Меня тут попросили (человек работает в картографии) написать своего рода велосипед - небольшую программку, которой на вход отдаётся *.tif файл (GeoTIFF с картой высот) а на выходе должна быть точно такая же *.tif картинка с сохранением всех метаданных, но обработанная медианным фильтром с достаточно большим окном (сотни пикселей). Файлы на входе будут большие (возможно десятки гигабайт), а всё, что тот человек смог найти - работает с такими объёмами крайне медленно (ибо медианный фильтр на большое окно, всё логично).

Я уже кое-что накарябал, но всё же решил поискать уже готовые варианты чтобы убедиться что мой велосипед будет не сильно велосипедным велосипедом :mrgreen:.
Пока такую функциональность нашёл в PhotoMOD, SAGA-Gis + что-то такое можно сделать связкой Python+GDAL+numpy+scipy, последнее работает быстрее всего.

Собственно, прошу совета какие пакеты программ ещё стоит посмотреть, т.к. называться эта функциональность может совсем непохоже на медианный фильтр (в SAGA-Gis это Rank-filter настроенный на 50%, например) и без знания терминологии можно в документации\меню пакета просто ничего не найти. В тех же QGis и GRASS найти ничего не удалось, хотя тут на форуме где-то писали что в GRASS медианный фильтр всё же есть.

Re: Нужен совет по медианному фильтру в разных программах

Добавлено: 22 июн 2018, 06:26
gamm
Если значения целые, и их немного, то медиана (как и любые квантили) быстро считается через гистограмму, которая обновляется при движении окна. Делите раст на тайлы с перекрытием, и запускаете в разные потоки, потом сливаете. Быстрее не получится.

Re: Нужен совет по медианному фильтру в разных программах

Добавлено: 22 июн 2018, 10:54
Sagrer
Да, у меня уже есть реализация алгоритма Хуанга, в т.ч. для значений с плавающей запятой (квантовать же можно), работает так что я даже засомневался надо ли делать многопоточность - там и на одном потоке узким местом становится уже hdd. Хотя, если поставить ещё больше размер окна... :).

Мне помощь нужна скорее не с тем как реализовать сам медианный фильтр, а с тем чтобы найти уже реализованные аналоги. Хотя-бы сравнить с ними мой вариант. Всё что до сих пор удалось найти - судя по скрости работает тупо в лоб, без всяких гистограмм. За исключением вероятно scipy (в исходники лезть не хочется, но он явно быстр).

Re: Нужен совет по медианному фильтру в разных программах

Добавлено: 22 июн 2018, 11:56
Александр Мурый
Sagrer писал(а):
21 июн 2018, 23:34
В тех же QGis и GRASS найти ничего не удалось, хотя тут на форуме где-то писали что в GRASS медианный фильтр всё же есть.
r.neighbors + "method=median" - оно?
Если нет, то можно попробовать применить более тяжёлую растровую артиллерию типа r.mapcalc или r.mfilter
Вот тут упоминается про медианный фильтр в GRASS с использованием двух выше упомянутых модулей.

Re: Нужен совет по медианному фильтру в разных программах

Добавлено: 22 июн 2018, 12:46
Crackfox
Попробуйте R, EBImage package
For example, a median filter:

# Load EBImage up
require(EBImage)
# Read in your image
im = readImage('/path/to/your/image')
# Apply a median filter with window size of 7
im.med = medianFilter(im, size=7)
# Display image
display(im.med)

Re: Нужен совет по медианному фильтру в разных программах

Добавлено: 22 июн 2018, 13:27
rhot
Crackfox писал(а):
22 июн 2018, 12:46
Попробуйте R
R не потянет десятки гигабайт. Я, например, почти всю обработку растров пускаю через GRASS.

Re: Нужен совет по медианному фильтру в разных программах

Добавлено: 22 июн 2018, 16:38
gamm
EBImage и правда не потянет, у него картинка должна быть в памяти. Работает через гистограмму, на маленькой картинке для сравнения можно использовать.

Re: Нужен совет по медианному фильтру в разных программах

Добавлено: 24 июн 2018, 20:24
Sagrer
Спасибо за наводки!

GRASS классная штука, но GUI делали для врагов :(.

Пока из найденного лидер по скорости scipy, но там та же проблема что и в EBImage - многогиговую картинку целиком в память грузить так себе идея. И велосипед с гистограммой, написанный на c++ получился всё равно быстрее. Наверное всё же он имеет смысл %).