MATLAB.Exponenta
MATLAB и Simulink на русском
Технологии разработки и отладки
		сложных технических систем

Обработка сигналов и изображений\ Image Processing Toolbox

И.М.Журавель "Краткий курс теории обработки изображений"

В оглавление книги \ К предыдущему разделу \ К следующему разделу

Анализ серии изображений с распределенной обработкой данных

Существуют задачи, при решении которых необходимо обрабатывать серию изображений. При этом изображения хранятся в различных графических файлах. Такие ситуации, например, могут возникать, когда через некоторые промежутки времени формируются изображения, которые фиксируют состояние некоторого динамического процесса.

При рассмотрении данного примера обработки серии изображений будет использоваться приложение Distributed Computing Toolbox. Рассмотрим основные этапы решения этой задачи:

  • Формирование названий файлов, которые подлежат обработке.
  • Определение алгоритмов, которые будут использоваться при обработке серии изображений.
  • Доступ к Job Manager.
  • Определение исполняющих функций.
  • Формирование переменной Job для Job Manager.
  • Формирование задач для Job.
  • Формирование результата.
  • Отображение результата.

Формирование названий файлов, которые подлежат обработке

Опишем путь к папке, которая содержит изображения, и далее используем эту информацию при создании списка названий файлов. В нашем примере графические файлы представляют собой 10 биомедицинских изображений клеток ткани. Эти файлы представляют собой только первые 10 из 100 захваченных изображений.

fileFolder = fullfile(matlabroot,'toolbox','images','imdemos');
dirOutput = dir(fullfile(fileFolder,'AT3_1m4_*.tif'));
fileNames = {dirOutput.name}'

fileNames = 

    'AT3_1m4_01.tif'
    'AT3_1m4_02.tif'
    'AT3_1m4_03.tif'
    'AT3_1m4_04.tif'
    'AT3_1m4_05.tif'
    'AT3_1m4_06.tif'
    'AT3_1m4_07.tif'
    'AT3_1m4_08.tif'
    'AT3_1m4_09.tif'
    'AT3_1m4_10.tif'

Визуализируем одно из этих изображений.

I = imread(fileNames{1});
imshow(I);
text(size(I,2),size(I,1)+15, ...
    'Image files courtesy of Alan Partin', ...
    'FontSize',7,'HorizontalAlignment','right');
text(size(I,2),size(I,1)+25, ....
    'Johns Hopkins University', ...
    'FontSize',7,'HorizontalAlignment','right');

Определение алгоритмов, которые будут использоваться при обработке серии изображений

Сформируем функцию обработки изображений, которая будет локализировать отдельные клетки на биомедицинских изображениях. Эта функция размещена в директории fileFolder. Протестируем ее на одном из изображений.

segmentedCells = ipexbatchDetectCells(I);
figure, imshow(segmentedCells);

Для просмотра ipexbatchDetectCells используем:

detectCellsPath = fullfile(matlabroot,'toolbox','images','imdemos', ...
    'ipexbatchDetectCells.m');
type(detectCellsPath);

function segmentedCells = ipexbatchDetectCells(I)
%ipexbatchDetectCells Algorithm to detect cells in image.
%   segmentedCells = ipexbatchDetectCells(I) detects cells in the cell
%   image I and returns the result in segmentedCells.
%
%   Supports batch processing demo, ipexbatch.m, 
%   ("Batch Processing of Image Files Using Distributed Computing").

%   Copyright 2005 The MathWorks, Inc.
%   $Revision: 1.1.6.3 $ $Date: 2006/06/15 20:09:42 $

% Use |edge| and the Sobel operator to calculate the threshold
% value. Tune the threshold value and use |edge| again to obtain a
% binary mask that contains the segmented cell.
[junk threshold] = edge(I, 'sobel');
fudgeFactor = .5;
BW = edge(I,'sobel', threshold * fudgeFactor);

se90 = strel('line', 3, 90);
se0 = strel('line', 3, 0);
BWdilate = imdilate(BW, [se90 se0]);
BWnobord = imclearborder(BWdilate, 4);
BWopen = bwareaopen(BWnobord,200);
BWclose = bwmorph(BWopen,'close');
BWfill = imfill(BWclose, 'holes');
BWoutline = bwperim(BWfill);
segmentedCells = I;
segmentedCells(BWoutline) = 255;

Доступ к Job Manager

Job Manager является составляющей приложения Distributed Computing, которая координирует выполнение работ по распределению конкретных задач.

if ~exist('jobManagerName','var')
    jobManagerName = 'default_jobmanager';
end

jobManager = findResource('jobmanager','Name', jobManagerName);

if numel(jobManager) > 1
    msg1 = sprintf('Found more than one job manager. Picking the first one');
    msg2 = sprintf('\nlocated on host %s. ', get(jobManager(1),'Hostname'));
    msg3 = 'Make sure that its workers can access the ';
    msg4 = sprintf('directory:\n%s.',fileFolder);
    warning('%s%s%s%s', msg1, msg2, msg3, msg4);
    jobManager = jobManager(1);
end

Определение исполняющих функций

Функция анализа изображений ipexbatchDetectCells предназначена для доступа к данным изображения в качестве исходных данных и возвращения модифицированного изображения в качестве результата. Однако отметим, что приложение Distributed Computing Toolbox оперирует не с данными изображения, а с названиями файлов изображений:

data = ipexbatchProcessFile(fileNames{1});
Для просмотра ipexbatchProcessFile, используем: 
processFilePath = fullfile(matlabroot,'toolbox','images','imdemos', ...
    'ipexbatchProcessFile.m');
type(processFilePath);

function data = ipexbatchProcessFile(imageFile)
%ipexbatchProcessFile Algorithm used to process image file.
%   DATA = ipexbatchProcessFile(FILENAME) processes image file FILENAME and
%   returns the result in DATA.
%
%   Supports batch processing demo, ipexbatch.m, 
%   ("Batch Processing of Image Files Using Distributed Computing").

%   Copyright 2005 The MathWorks, Inc.
%   $Revision: 1.1.6.3 $ $Date: 2006/06/15 20:09:42 $

imageFilePath = fullfile(matlabroot,'toolbox','images','imdemos',imageFile);
I = imread(imageFilePath);
data.Filename = imageFilePath;
data.Original = I;
data.Final = ipexbatchDetectCells(I);

Формирование переменной Job для Job Manager

После формирования job manager (функция управления заданиями) необходимо приступить к формированию переменной job для jobManager.

job = createJob(jobManager, 'FileDependencies', ...
    {processFilePath,detectCellsPath});
get(job)
                      Name: 'job_70'
                        ID: 70
                  UserName: 'isimon'
                       Tag: ''
                     State: 'pending'
             RestartWorker: 0
                   Timeout: Inf
    MaximumNumberOfWorkers: 2.1475e+009
    MinimumNumberOfWorkers: 1
                CreateTime: 'Tue Jun 07 18:05:24 EDT 2005'
                SubmitTime: ''
                 StartTime: ''
                FinishTime: ''
                     Tasks: [0x1 double]
          FileDependencies: {2x1 cell}
                   JobData: []
                    Parent: [1x1 distcomp.jobmanager]
                  UserData: []
                 QueuedFcn: []
                RunningFcn: []
               FinishedFcn: []

Формирование задач для Job

numFcnOutputArgs = 1;
for k = 1:length(fileNames)
    task(k) = createTask(job, @ipexbatchProcessFile, numFcnOutputArgs, ...
        {fileNames{k}});
end
firstTaskState = get(task(1),'State')

firstTaskState =

pending

submit(job)
firstTaskState = get(task(1),'State')

firstTaskState =

pending

Формирование результата

После определения всех процедур до окончания обработки пользователь может:

  • продолжать работать в системе MATLAB и периодически контролировать процесс обработки;
  • получить результат обработки после окончания вычислений. Выберем вторую опцию –waitForState.

waitForState(job)
firstTaskState = get(task(1),'State')

firstTaskState =

finished

В нашем примере анализируется только 10 изображений, поэтому результаты обработки всех 10 задач считываются в рабочее пространство MATLAB с использованием getAllOutputArguments. results = getAllOutputArguments(job);

Отображение результата

figure
for k = 1:length(results)
    imshow(results{k}.Original);
    pause(1);
    imshow(results{k}.Final);
    pause(1);
end

Основное преимущество распределенных вычислений проявляется при обработке серии файлов изображений. Состоит это преимущество в поиске компромисса между скоростью вычислений и загруженностью памяти вычислительной машины.

При решении такого рода задач, т.е. при наличии последовательно захваченных кадров изображений, интересно будет представить эту серию в виде видеопоследовательности. Для этого допустим, что исходные данные представлены серией изображений I1,I2,...I10.

Считаем их из соответствующих файлов в рабочее пространство MATLAB.

I1=imread('I1.bmp');
I2=imread('I2.bmp');
I3=imread('I3.bmp');
I4=imread('I4.bmp');
I5=imread('I5.bmp');
I6=imread('I6.bmp');
I7=imread('I7.bmp');
I8=imread('I8.bmp');
I9=imread('I9.bmp');
I10=imread('I10.bmp');

Далее выполним преобразование полноцветных изображений в палитровые. У всех кадров формируемой видеопоследовательности должна быть одинаковая палитра, поэтому первое изображение преобразовываем с подбором оптимальной палитры map и применяем эту палитру к остальным изображениям.

[I1, map]=rgb2ind(I1,200);
[I2]=rgb2ind(I2,map);
[I3]=rgb2ind(I3,map);
[I4]=rgb2ind(I4,map);
[I5]=rgb2ind(I5,map);
[I6]=rgb2ind(I6,map);
[I7]=rgb2ind(I7,map);
[I8]=rgb2ind(I8,map);
[I9]=rgb2ind(I9,map);
[I10]=rgb2ind(I10,map);

Формируем многокадровое палитровое изображение.

II=cat(4,I1,I2,I3,I4,I5,I6,I7,I8,I9,I10);

Формируем матрицу видеопоследовательности.

II_mov=immovie(II,map);

Выводим 5 раз видеопоследовательность на экран с частотой 10 кадров в секунду.

movie(II_mov,5,10);

В системе MATLAB существуют также другие подходы к визуализации серии изображений. Для этого можно, например, использовать функцию вывода на экран всех кадров многокадрового изображения montage

montage(II);

В оглавление книги \ К предыдущему разделу \ К следующему разделу


Поиск по сайту:

Система Orphus

Яндекс.Метрика