В этом примере показано, как добавить, что поддержка чтения целого понижения отображает путем создания пользовательского блокированного адаптера изображений. Пример создает интерфейс MATLAB к библиотеке OpenSlide C, библиотеке C, которая обеспечивает простой интерфейс, чтобы считать изображения целого понижения (также известный как виртуальные слайды). Библиотека OpenSlide является продуктом исследовательской группы М. Сэтьянэраянэна в Университете Карнеги-Меллон, Школе Информатики.
Пример сначала создает интерфейс C++ к библиотеке OpenSlide с помощью clibgen
MATLAB функция. Пример затем использует функции от библиотеки OpenSlide, чтобы реализовать пользовательский блокированный адаптер изображений.
Убедитесь, что файлы помощника находятся на пути.
addpath(pwd)
Этот раздел использует clibgen.generateLibraryDefinition
MATLAB функция, чтобы сгенерировать интерфейс к библиотечным функциям OpenSlide.
Загрузите последнюю библиотеку OpenSlide для своей компьютерной и операционной системы. Этот пример принимает компьютер Windows.
Создайте переменную, которая указывает туда, где вы извлекли Библиотеку OpenSlide. Эта папка, как ожидают, будет содержать bin\
Включение
, и 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)
Разделяемое имя библиотеки (библиотечный файл) и местоположение (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.
Создайте адаптер 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)