exponenta event banner

Чтение изображений всего слайда с помощью пользовательского блокированного адаптера изображений

В этом примере показано, как добавить поддержку для чтения изображений всего слайда путем создания пользовательского блокированного адаптера изображений. В примере создается интерфейс MATLAB с библиотекой OpenSlide C, библиотекой C, которая обеспечивает простой интерфейс для чтения изображений всего слайда (также называемых виртуальными слайдами). Библиотека OpenSlide является продуктом исследовательской группы М. Сатьянараянана в Университете Карнеги-Меллон, Школа компьютерных наук.

В примере сначала создается интерфейс C++ к библиотеке OpenSlide с помощью MATLAB clibgen функция. Затем в примере используются функции из библиотеки OpenSlide для реализации пользовательского блокированного адаптера образа.

Убедитесь, что в пути находятся вспомогательные файлы.

addpath(pwd)

Создание интерфейса MATLAB для библиотеки OpenSlide

В этом разделе используется MATLAB clibgen.generateLibraryDefinition для создания интерфейса с функциями библиотеки OpenSlide.

Загрузите библиотеку 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';

Создание файла определения интерфейса OpenSlide

Создание файла определения интерфейса библиотеки с помощью 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. Дополнительные сведения о блокированных изображениях и создании блокированного адаптера изображений см. в документации по 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)

См. также

|