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

В этом примере показано, как добавить поддержку чтения изображений со всего слайда путем создания пользовательского блокированного адаптера изображений. Пример создает интерфейс 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 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. Чтобы узнать больше о заблокированных изображениях и создании блокированного адаптера изображений, смотрите документацию 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)

См. также

|

Для просмотра документации необходимо авторизоваться на сайте