В этом примере показано, как добавить поддержку чтения изображений со всего слайда путем создания пользовательского блокированного адаптера изображений. Пример создает интерфейс MATLAB для библиотеки OpenSlide C, библиотеки на C, которая обеспечивает простой интерфейс для чтения изображений с ползунком (также известных как виртуальные слайды). Библиотека OpenSlide является продуктом исследовательской группы М. Сатьянараянана в Университете Карнеги-Меллона, Школа компьютерных наук.
Сначала пример создает интерфейс C++ к библиотеке OpenSlide с помощью MATLAB clibgen
функция. Затем пример использует функции из библиотеки OpenSlide для реализации пользовательского блокированного адаптера изображений.
Убедитесь, что файлы помощника указаны в пути.
addpath(pwd)
Этот раздел использует MATLAB clibgen.generateLibraryDefinition
функция для генерации интерфейса с функциями библиотеки OpenSlide.
Загрузите последнюю библиотеку OpenSlide для вашего компьютера и операционной системы. В этом примере подразумевается компьютер под управлением Windows.
Создайте переменную, указывающую на место извлечения библиотеки OpenSlide. Ожидается, что эта папка будет содержать bin\
, include\
, и lib\
подпапки.
OpenSlideInstall = 'I:\my_example\openslide-win64-20171122';
dir(OpenSlideInstall)
. README.txt bin lib .. VERSIONS.txt include licenses
Добавьте расположение общей библиотеки OpenSlide в системный путь.
sharedLibLoc = fullfile(OpenSlideInstall, 'bin'); systemPath = getenv('PATH'); setenv('PATH', [sharedLibLoc ';' systemPath])
Создайте переменные, которые содержат имена папок, содержащих ключевые элементы вашей среды разработки.
Создайте переменную, которая указывает на папку, в которой вы хотите хранить предопределенный файл определения для создаваемого интерфейса OpenSlide.
ExampleDir = 'I:\my_example';
Создайте переменную, чтобы указать на файл тестового изображения. Загрузите CMU-1.zip тестовый файл со страницы тестовых данных OpenSlide и обновите переменную ниже, чтобы указать на файл извлеченного изображения.
imageLocation = 'I:\my_example\CMU-1.mrxs';
Сгенерируйте файл определения интерфейса библиотеки с помощью clibgen.generateLibraryDefinition
функция.
Создайте переменную, которая указывает на папку с возможностью записи для хранения сгенерированных файлов интерфейса. Создайте папку, в которую можно записать файл интерфейса MATLAB OpenSlide Interface и переключиться на эту папку.
OpenSlideInterface = 'I:\my_example\interfaceFolder'; if ~isfolder(OpenSlideInterface) mkdir(OpenSlideInterface) end cd(OpenSlideInterface)
Создайте переменные для указания папки библиотеки OpenSlide, двух файлов заголовка OpenSlide, пути к файлам заголовка, имени библиотеки OpenSlide и задайте имя, которое необходимо назначить сгенерированному интерфейсу.
libPath = fullfile(OpenSlideInstall,'lib'); hppFiles = {'openslide.h', 'openslide-features.h'}; hppPath = fullfile(OpenSlideInstall, 'include', 'openslide'); libFile = 'libopenslide.lib'; myPkg = 'OpenSlideInterface';
Вызовите clib.generateLibraryDefinition
функция, задающая настроенные переменные.
Имена заголовочных файлов (hppFiles) и местоположение (hppPath)
Папка, содержащая файлы включения (hppPath)
Имя общей библиотеки (libFile) и расположение (libPath)
Имя, которое нужно дать сгенерированной библиотеке интерфейсов (myPkg) -- необязательно
Вы можете опционально задать 'Verbose'
параметр true для отображения сообщений, полученных во время генерации.
% Clear previous run (if any) if isfile('defineOpenSlideInterface.m') delete('defineOpenSlideInterface.m') end clibgen.generateLibraryDefinition(fullfile(hppPath,hppFiles),... 'IncludePath', hppPath,... 'Libraries', fullfile(libPath,libFile),... 'PackageName', myPkg,... 'Verbose',false)
Using MinGW64 Compiler (C++) compiler. Generated definition file defineOpenSlideInterface.mlx and data file 'OpenSlideInterfaceData.xml' contain definitions for 24 constructs supported by MATLAB. 21 construct(s) require(s) additional definition. To include these construct(s) in the interface, edit the definitions in defineOpenSlideInterface.mlx. Build using build(defineOpenSlideInterface). Use the 'Verbose' option to see the warnings generated while parsing the files for generating interface.
The clibgen.generateLibraryDefinition
команда создает два файла: файл определения интерфейса библиотеки defineOpenSlideInterface.m
и defineOpenSlideInterface.mlx
. Чтобы использовать сгенерированный файл интерфейса для создания блокированного адаптера изображений, требуются определенные изменения. Тулбокс предоставляет файл интерфейса шаблона, который содержит эти правки, но вы все еще должны предоставить информацию о местоположении для определенных ключевых папок. В этом разделе эти изменения выполняются в файле шаблона.
Сначала переименуйте файл интерфейса, который вы сгенерировали с помощью clib.generateLibraryDefinition
и сохраните его как резервный файл.
movefile('defineOpenSlideInterface.m','defineOpenSlideInterface_generated.m');
Удалите .mlx
файл, созданный clibgen.generateLibraryDefinition
функцию, а затем вызов rehash
.
delete defineOpenSlideInterface.mlx;
rehash
Отредактируйте файл шаблона определения интерфейса, включенный в тулбокс. Изменения обеспечивают расположение ключевых папок в установке. Сначала откройте файл шаблона определения интерфейса, включенный в этот пример, для доступа к чтению. Чтение содержимого в переменную, называемую interfaceContents
и закройте файл шаблона.
fid = fopen(fullfile('defineOpenSlideInterface_template.m'),'rt'); interfaceContents = fread(fid, 'char=>char'); fclose(fid);
Обновите поместите переменные владельца в переменную файла шаблона, interfaceContents
, с вашими фактическими именами папок.
interfaceContents = strrep(interfaceContents', 'OPENSLIDE_INSTALL_LOCATION', OpenSlideInstall); interfaceContents = strrep(interfaceContents, 'OPENSLIDE_INTERFACE_LOCATION', OpenSlideInterface);
Теперь запишите обновленную переменную шаблона определения интерфейса в новый файл. Откройте файл определения интерфейса для доступа на запись, запишите переменную файла шаблона в файл, а затем закройте файл..
fid = fopen('defineOpenSlideInterface.m','wt'); fwrite(fid, interfaceContents); fclose(fid);
Чтобы убедиться, что изменения в файле интерфейса были успешными, можно просмотреть различия между сгенерированным файлом интерфейса и отредактированным файлом шаблона интерфейса.
Используя файл определения интерфейса OpenSlide, используйте build
команда для создания общей библиотеки MATLAB OpenSlideInterface.
build(defineOpenSlideInterface)
Building interface file 'OpenSlideInterfaceInterface.dll'. Interface file 'OpenSlideInterfaceInterface.dll' built in folder 'I:\my_example\interfaceFolder\osInterface\OpenSlideInterface'. To use the library, add the interface file folder to the MATLAB path.
Добавьте путь к библиотеке сгенерированных интерфейсов.
addpath osInterface\OpenSlideInterface\
Обязательно щелкните ссылку в сообщении после завершения сборки, чтобы добавить файл интерфейса к пути
Чтобы просмотреть функциональные возможности библиотеки интерфейсов, используйте функцию summary.
summary(defineOpenSlideInterface)
MATLAB Interface to OpenSlideInterface Library Class clib.OpenSlideInterface.openslide_t No Constructors defined No Methods defined No Properties defined Functions clib.OpenSlideInterface.openslide_t clib.OpenSlideInterface.openslide_open(string) int32 clib.OpenSlideInterface.openslide_get_level_count(clib.OpenSlideInterface.openslide_t) [int64,int64] clib.OpenSlideInterface.openslide_get_level_dimensions(clib.OpenSlideInterface.openslide_t,int32,int64,int64) Note: 'int64' used as MLTYPE for C++ pointer argument. Passing nullptr is not supported with 'int64' types. To allow nullptr as an input, set MLTYPE to clib.array. double clib.OpenSlideInterface.openslide_get_level_downsample(clib.OpenSlideInterface.openslide_t,int32) clib.OpenSlideInterface.openslide_read_region(clib.OpenSlideInterface.openslide_t,clib.array.OpenSlideInterface.UnsignedInt,int64,int64,int32) clib.OpenSlideInterface.openslide_close(clib.OpenSlideInterface.openslide_t)
Чтобы протестировать интерфейс библиотеки, попробуйте использовать функции в библиотеке с образцом изображения.
Загрузите файл образца изображения с помощью openslide_open
функция.
ob = clib.OpenSlideInterface.openslide_open(imageLocation);
Получите количество уровней слайдов, имеющихся в этом файле примера.
levels = clib.OpenSlideInterface.openslide_get_level_count(ob);
Получите размерности слайда на уровне 0.
[w, h] = clib.OpenSlideInterface.openslide_get_level_dimensions(ob,int32(0),int64(0),int64(0)); disp([w, h])
109240 220696
Чтение области с уровня 0 с помощью openslide_read_region
функция. Setup clibArray
типа UnsignedInt
с желаемыми размерностями ширины и высоты. Задайте верхнюю часть левую координату X и верхнюю часть левую координату Y в опорной системе координат уровня 0.
rawCData = clibArray('clib.OpenSlideInterface.UnsignedInt', [1024, 1024]);
clib.OpenSlideInterface.openslide_read_region(ob,rawCData,int64(33792),int64(113664),int32(0));
Постпроцессная обработка приобретенной области от clibArray
чтобы преобразовать его в uint8
Изображение RGB.
rawImageData = uint32(rawCData); RGBA = typecast(rawImageData(:), 'uint8'); % Ignore the A channel RGB(:,:,1) = reshape(RGBA(3:4:end),1024,1024); RGB(:,:,2) = reshape(RGBA(2:4:end),1024,1024); RGB(:,:,3) = reshape(RGBA(1:4:end),1024,1024);
Отобразите обработанную область изображения.
figure; imshow(RGB);
Чтобы считать изображения с полным слайдом, создайте пользовательский адаптер для чтения и записи на основе блоков, который использует возможности интерфейса OpenSlide, созданного выше.
Чтобы создать блокированный адаптер изображений, сначала создайте класс, который подклассифицирует класс интерфейса блокированного адаптера изображений, images.blocked.Adapter
. Чтобы узнать больше о заблокированных изображениях и создании блокированного адаптера изображений, смотрите документацию images.blocked.Adapter.
Создайте адаптер OpenSlide только для чтения с помощью следующих методов:
openToRead
- открытый исходный код для чтения
getInfo
- собирать информацию об источнике
getIOBlock
- получите заданный блок ввода-вывода
Используйте функции интерфейса OpenSlide, сгенерированные выше, для реализации этих методов.
Образец адаптера включен в этот пример, OpenSlideAdapter.m
. Чтобы просмотреть этот адаптер, можно открыть файл в редакторе.
Используйте новый адаптер с образцом изображения путем определения его в blockedImage
конструктор объектов:
bim = blockedImage(imageLocation, "Adapter", OpenSlideAdapter)
bim = blockedImage with properties: Read only properties Source: "I:\my_example\CMU-1.mrxs" Adapter: [1×1 OpenSlideAdapter] Size: [10×3 double] SizeInBlocks: [10×3 double] ClassUnderlying: [10×1 string] Settable properties BlockSize: [10×3 double] UserData: [1×1 struct]
disp(bim.Size)
220696 109240 3 110348 54620 3 55174 27310 3 27587 13655 3 13793 6827 3 6896 3413 3 3448 1706 3 1724 853 3 862 426 3 431 213 3
bigimageshow(bim)