Пример обработки изображения в пакете Matlab

Источник информации: http://matlab.exponenta.ru

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

Считывание и отображение изображения

Очистим рабочее пространство MATLAB, закроем все открытые окна просмотра и закроем все открытые средства Image Tools.

     clear, close all, imtool close all

Считаем и визуализируем полутоновое изображение rice.png.

     I = imread('rice.png');
     imshow(I)

Полутоновое изображение rice.png

Оценка и аппроксимация значений пикселей фона

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

В примере используется функция imopen, которая выполняет морфологическое раскрытие. При этом также используется функция strel для создания структурного элемента в виде диска с радиусом 15.

     background = imopen(I,strel('disk',15));

Для просмотра и оценки фона используются следующие команды

     figure, imshow(background)

Аппроксимация и просмотр поверхности фона

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

     figure, surf(double(background(1:8:end,1:8:end))),zlim([0 255]);
     set(gca,'ydir','reverse');

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

На основе этого можно проводить анализ фона исследуемого изображения.

Создание изображения с равномерным фоном

Для создания изображения с более равномерным фоном, вычтем изображение фона background из исходного изображения I.

     I2 = imsubtract(I,background);

Отобразим полученное изображение с более равномерным фоном.

     figure, imshow(I2)

Изображение с равномерным фоном

Улучшение контраста на обрабатываемом изображении

После вычитания, полученное изображение будет иметь более равномерный фон и будет более темным. Используем функцию imadjust для повышения контраста изображения.

     I3 = imadjust(I2);

Функция imadjust увеличивает контраст изображения путем растяжения значений интенсивностей динамического диапазона. Для более детальной информации см. описание функции imadjust. Отобразим улучшенное изображение I3.

     figure, imshow(I3);

Изображение после коррекции интенсивностей

Создание бинарного изображения

Бинарное изображение можно создать используя функцию thresholding. Однако функция graythresh автоматически определяет подходящий порог, который используется для преобразования полутонового изображения в бинарное. Функция im2bw выполняет это преобразование.

     level = graythresh(I3);
     bw = im2bw(I3,level);
     figure, imshow(bw)

Бинарное изображение

Возвращаемое функцией im2bw бинарное изображение bw представлено в формате logical. В этом можно убедится, воспользовавшись функцией whos. Приложение Image Processing Toolbox использует логические массивы для представления бинарных изображений.

     whos

Реакцией системы MATLAB на эту функцию будет

Name Size Bytes Class




I 256x256 65536 uint8 array
I2 256x256 65536 uint8 array
I3 256x256 65536 uint8 array
background 256x256 65536 uint8 array
bw 256x256 65536 logical array
level 1x1 8 double array











В общей сложности используется 327681 элемента, которые занимают 327688 байт.

Определение числа объектов на изображении

После преобразования изображения в бинарное, можно использовать функцию bwlabel для определения числа объектов (зерен риса) на изображении. Функция bwlabel отмечает все компоненты на бинарном изображении bw и возвращает их число в виде значения numObjects.

     [labeled,numObjects] = bwlabel(bw,4);

     numObjects
     ans =
        101

Точность результата зависит от некоторых факторов, включая
     1.Размер объектов;
     2.Соприкасаются ли между собой объекты (в этом случае они могут определятся как один объект);
     3.Точность аппроксимации фона.
     4.Выбор связности.

Анализ матрицы меток

Для проведения анализа формирования матрицы меток, возвращаемой функцией bwlabel, рассмотрим значения пикселей изображения. Есть несколько путей получения значений пикселей изображения. Например, используя функцию imcrop, можно просматривать небольшие порции изображения. Другой путь состоит в использовании приложения Pixel Region tool для просмотра значений пикселей. Отобразим матрицу меток с использованием функции imshow,

     figure, imshow(labeled);

Запуск приложения Pixel Region tool.

     impixelregion

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

На следующем изображении представлен Image Viewer с прямоугольником Pixel Region, размещенным на границе двух рисовых гранул. Отметим, что значения пикселей фона и отдельных гранул являются одинаковыми. Так, в частности, значение фона равно 0.

Область, отображаемая в Pixel Region Tool

Просмотр матрицы средствами Pixel Region Tool

Отображение матрицы меток в виде псевдоцветного индексного изображения

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

Для просмотра матрицы меток используется функция label2rgb. Эта функция применяется при создании палитры, цвета фона и цвета каждого объекта изображения.

     pseudo_color = label2rgb(labeled, @spring, 'c', 'shuffle');
     imshow(pseudo_color);

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

Измерение свойств объектов на изображении

Функция regionprops применяется для измерения свойств объектов в некоторой окрестности изображения и представляет результат в виде массива. Если применить это к изображению с отмеченными компонентами, то создается структура для каждой компоненты.

В этом примере используется функция regionprops для создания структурированного массива, содержащего некоторые основные свойства. Если установить свойствам параметр 'basic', тогда функция regionprops возвращает три измеренных параметра: площадь, центроид (или центр масс) и ограничивающий прямоугольник (локальная окрестность). В данном случае ограничивающий прямоугольник представляет собой локальную окрестность, отображающую гранулы риса.

     graindata = regionprops(labeled,'basic')

Система MATLAB выдает такой результат

     graindata =

     101x1 struct array with fields:
     Area
     Centroid
     BoundingBox

Для поиска области с 51-м отмеченным компонентом, необходимо найти поле Area field и его 51 элемент в структуре массива graindata.

     graindata(51).Area

В этом случае результат будет таким

     ans =
        140

Для поиска наименее возможного прямоугольника и центроида (центра масс) некоторых компонентов используется следующий код:

graindata(51).BoundingBox, graindata(51).Centroid

     ans =
        107.5000    4.5000     13.0000     20.0000

     ans =
        114.5000    15.4500

Вычисление статистических свойств объектов изображения

Функции системы MATLAB могут использоваться для вычисления статистических свойств объектов. Сначала используется функция max для поиска наибольшего зерна. (В нашем примере наибольшими являются два зерна риса, которые соприкасаются.)

     max([graindata.Area])

Результат представляется в виде

     ans =
        404

Далее с помощью функции find найдем те компоненты, которыми отмечены зерна риса с этой площадью.

     biggrain = find([graindata.Area]==404)

Результат представляется в виде

     biggrain =
        59

Найдем средний размер всех зерен риса.

     mean([graindata.Area])

Результат будет представлен в виде

     ans =
        175.0396

Постоим гистограмму распределения зерен риса по их размеру (при этом будем использовать 20 позиций при градации по оси площади). Из гистограммы видно, что основная часть зерен риса имеет площадь от 150 до 250 пикселей.

     hist([graindata.Area],20)