Я бы использовал libvips для чтения изображений SVS.Он имеет хорошую операцию импорта openslide, написанную разработчиками openslide, и хорошо справляется с подобными вещами.Это бесплатно и кроссплатформенно.У большинства linux это есть в менеджере пакетов.
В командной строке вы можете написать:
$ vipsheader CMU-1.svs
CMU-1.svs: 46000x32914 uchar, 4 bands, rgb, openslideload
$ time vips crop CMU-1.svs x.jpg 10 10 100 100
real 0m0.058s
user 0m0.050s
sys 0m0.008s
Помните, что jp2k довольно медленно декодируется.Чтобы преобразовать все изображение, я вижу:
$ time vips copy CMU-1.svs x.jpg --vips-progress
vips temp-5: 46000 x 32914 pixels, 8 threads, 128 x 128 tiles, 256 lines in buffer
vips temp-5: done in 14.6s
real 0m14.720s
user 1m10.978s
sys 0m1.179s
В C ++:
// compile with
// g++ crop.cpp `pkg-config vips-cpp --cflags --libs`
#include <vips/vips8>
int
main (int argc, char **argv)
{
if (VIPS_INIT (argv[0]))
vips_error_exit (NULL);
vips::VImage image = vips::VImage::new_from_file (argv[1]);
image.write_to_file (argv[2]);
}
Есть привязки C, Python, Ruby, JavaScript, PHP, C #, Go, Rust и т. Д.тоже.
Вы можете написать другие форматы, изменив имя выходного файла или установив необязательные аргументы в коде C ++.Например, вы можете запустить эту программу на C ++ с помощью:
$ ./a.out CMU-1.svs x.tif[compression=jpeg,tile,pyramid]
Или вы можете изменить write_to_file
на:
image.tiffsave (argv[2], VImage::option()
->set ("compression", "jpeg")
->set ("tile", TRUE)
->set ("pyramid", TRUE));
В документации есть все детали .