В этом примере показано, как добавить поддержку для чтения изображений всего слайда путем создания пользовательского блокированного адаптера изображений. В примере создается интерфейс 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 и измените его.
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.
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 OpenSleyInterface.
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(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 функция. Настройка a 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)
