Источник информации: http://matlab.exponenta.ru
В этом разделе рассматриваются некоторые основы обработки изображений. В примере показана статистическая обработка изображения, а также предварительная обработка для получения улучшенного результата. Предобработка включает формирование равномерного фона на изображении и преобразование изображения в бинарное. Пример состоит из некоторых основных шагов.
Очистим рабочее пространство MATLAB, закроем все открытые окна просмотра и закроем все открытые средства Image Tools.
     clear, close all, imtool close all
Считаем и визуализируем полутоновое изображение rice.png.
     I = imread('rice.png');
     imshow(I)
Рассматриваемое изображение характеризуется неравномерной засветкой фона по полю изображения. Поэтому сначала с помощью операции морфологического раскрытия оценим интенсивность фона. При выполнении операции морфологического раскрытия используется структурный элемент.
В примере используется функция 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.
Один из возможных путей отображения матрицы меток состоит в использовании псевдоцветного индексного изображения. В псевдоцветном изображении числа, которые идентифицируют каждый объект в матрице меток, отображаются разным цветом, который связан с соответствующей палитрой цветов. Такое представление позволяет различать различные объекты.
Для просмотра матрицы меток используется функция 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)