Считайте изображения целого понижения с пользовательским блокированным адаптером изображений

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

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

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

addpath(pwd)

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

Этот раздел использует clibgen.generateLibraryDefinition MATLAB функция, чтобы сгенерировать интерфейс к библиотечным функциям OpenSlide.

Загрузите Библиотеку OpenSlide и Добавьте его в Путь

Загрузите последнюю библиотеку OpenSlide для своей компьютерной и операционной системы. Этот пример принимает компьютер Windows.

Создайте переменную, которая указывает туда, где вы извлекли Библиотеку OpenSlide. Эта папка, как ожидают, будет содержать bin\Включение, и lib\ подпапки.

OpenSlideInstall = 'I:\my_example\openslide-win64-20171122';
dir(OpenSlideInstall)
.             VERSIONS.txt  lib           
..            bin           licenses      
README.txt    include       

Добавьте, что местоположение 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)

  • Разделяемое имя библиотеки (библиотечный файл) и местоположение (libPath)

  • Назовите, чтобы дать сгенерированной интерфейсной библиотеке (myPkg) - Дополнительный

Вы можете дополнительный набор 'Verbose' параметр к истинному, чтобы отобразить сообщения, произведенные во время генерации.

% 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 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. Чтобы узнать больше о блокированных изображениях и создании блокированного адаптера изображений, просмотрите документацию images.blocked.Adapter.

Создайте адаптер OpenSlide только для чтения путем реализации следующих методов:

  • openToRead - открытый исходный код для чтения

  • getInfo - соберите информацию об источнике

  • getIOBlock - получите заданный блок IO

Используйте функции интерфейса OpenSlide, сгенерированные выше, чтобы реализовать эти методы.

Демонстрационный адаптер включен в этот пример, OpenSlideAdapter.m. Чтобы просмотреть этот адаптер, можно открыть файл в редакторе.

Используйте новый адаптер с демонстрационным изображением путем определения его в blockedImage конструктор Object:

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)

Смотрите также

| |