exponenta event banner

integralImage

Расчет 2-D интегрального изображения

Описание

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

Интегральное изображение позволяет быстро вычислять суммирование по субрегионам изображения. Суммирование субрегионов может быть вычислено за постоянное время как линейная комбинация только четырех пикселей в интегральном изображении, независимо от размера субрегиона. Использование интегральных изображений было популяризировано алгоритмом Виолы-Джонса [1].

пример

J = integralImage(I) вычисляет интегральное изображение из изображения I. Функция «ноль» помещает верхнюю и левую стороны выходного интегрального изображения, J.

пример

J = integralImage(I,orientation) вычисляет интегральное изображение с ориентацией, заданной orientation.

Примеры

свернуть все

Создайте простую матрицу-образец.

I = magic(5)
I = 5×5

    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9

Вычислите интегральное изображение матрицы образца. Эти шаги показывают, как первые несколько значений в исходной матрице сопоставляются со значениями в интегральном изображении. Следует отметить, что пиксель с координатой (строка, столбец) (r, c) в исходном изображении соответствует пикселю с координатой (r + 1, c + 1) в интегральном изображении.

  • Первая строка и столбец в интегральном изображении - все 0s.

  • Пиксель в исходной матрице с координатой (1, 1) со значением 17 остается неизменным в интегральном изображении, поскольку в сммации нет других пикселей. Следовательно, пиксель в интегральном изображении с координатой (2, 2) имеет значение 17.

  • Пиксель в исходной матрице с координатой (1, 2) отображается на пиксель (2, 3) в интегральном изображении. Значение является суммированием исходного значения пикселя (24), пикселей над ним (0) и пикселей слева (17): 24 + 17 + 0 = 41.

  • Пиксель в исходной матрице с координатой (1, 3) отображается на пиксель (2, 4) в интегральном изображении. Значение является суммированием исходного значения (1) пикселя, пикселя над ним (0) и пикселей слева от него (которые уже были суммированы до 41). Таким образом, значение в пикселе (2,4) в интегральном изображении равно 1 + 41 + 0 = 42.

J = integralImage(I)
J = 6×6

     0     0     0     0     0     0
     0    17    41    42    50    65
     0    40    69    77    99   130
     0    44    79   100   142   195
     0    54   101   141   204   260
     0    65   130   195   260   325

Чтение изображения в градациях серого в рабочую область. Отображение изображения.

I = imread('pout.tif');
imshow(I)

Вычислите интегральное изображение.

J = integralImage(I);

Используйте drawrectangle инструмент для выбора прямоугольного субрегиона. Инструмент возвращает Rectangle объект.

d = drawrectangle;

Vertices имущества Rectangle объект сохраняет координаты вершин в виде матрицы 4 на 2. Вершины упорядочиваются, начиная с верхнего левого и продолжая в направлении по часовой стрелке. Разбейте матрицу на два вектора, содержащих координаты строки и столбца. Поскольку интегральное изображение заполнено нулями в верхней и левой части, увеличьте координаты строки и столбца на 1, чтобы извлечь соответствующие элементы интегрального массива.

r = floor(d.Vertices(:,2)) + 1;
c = floor(d.Vertices(:,1)) + 1;

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

regionSum = J(r(1),c(1)) - J(r(2),c(2)) + J(r(3),c(3)) - J(r(4),c(4))
regionSum = 613092

Создайте простую матрицу-образец.

I = magic(5)
I = 5×5

    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9

Создание интегрального изображения с повернутой ориентацией.

J = integralImage(I,'rotated')
J = 6×7

     0     0     0     0     0     0     0
     0    17    24     1     8    15     0
    17    64    47    40    38    39    15
    64    74    91   104   105    76    39
    74   105   149   188   183   130    76
   105   170   232   272   236   195   130

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

r = 1;
c = 3;
h = 1;
w = 2;

Получение значения четырех угловых пикселов субрегиона в интегральном изображении.

regionBottom = J(r+w+h,c-h+w+1);
regionTop = J(r,c+1);
regionLeft = J(r+h,c-h+1);
regionRight = J(r+w,c+w+1);
regionCorners = [regionBottom regionTop regionLeft regionRight]
regionCorners = 1×4

   105     0    24    39

Вычислите сумму пикселов в субрегионе путем суммирования четырех угловых значений пикселов.

regionSum = regionBottom + regionTop - regionLeft - regionRight
regionSum = 42

Входные аргументы

свернуть все

Изображение, указанное как числовой массив любого размера. Если входное изображение имеет более двух размеров (ndims(I)>2), например, для образа RGB, затем integralImage вычисляет интегральное изображение для всех 2-D плоскостей вдоль более высоких размеров.

Типы данных: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32

Ориентация изображения, указанная как 'upright' или 'rotated'. Если для ориентации задано значение 'rotated', то integralImage возвращает интегральное изображение для вычисления сумм по прямоугольникам, повернутым на 45 градусов.

Типы данных: char | string

Выходные аргументы

свернуть все

Интегральное изображение, возвращаемое в виде числовой матрицы. Функция zero-pads интегральное изображение в соответствии с orientation изображения. Такой размер облегчает вычисление сумм пикселей вдоль границ изображения. Интегральное изображение, J, является по существу дополненной версией значения cumsum(cumsum(I,2)).

Ориентация изображенияРазмер интегрального изображения
Вертикальное интегральное изображениеСверху и слева заполнено нулями. size(J) = size(I)+1
Повернутое интегральное изображениеНоль заполнен вверху, слева и справа. size(J) = size(I)+[1 2]

Типы данных: double

Алгоритмы

свернуть все

Суммирование интегрального изображения

Каждый пиксель в интегральном изображении представляет собой суммирование соответствующего значения входного пикселя со всеми входными пикселями выше и слева от входного пикселя. Поскольку integralImage нуль-подушечки результирующего интегрального изображения, пиксель с координатой (строка, столбец) (m, n) в исходном изображении сопоставляется с пикселем с координатой (m+1, n+ 1) в интегральном изображении.

На чертеже текущий пиксель во входном изображении представляет собой темно-зеленый пиксель с координатой (4, 5). Все пиксели во входном изображении выше и слева от входного пикселя окрашены в светло-зеленый цвет. Суммирование значений зеленого пикселя возвращается в пикселе интегрального изображения с координатой (5, 6), окрашенной в серый цвет.

integralImage выполняет более быстрое вычисление интегрального изображения путем суммирования значений пикселей как во входном изображении, так и в интегральном изображении. Пиксель (m, n) в интегральном изображении J представляет собой линейную комбинацию всего из четырёх пикселей: один из входного изображения и три ранее рассчитанных пикселя из интегрального изображения.

J(m,n) = J(m,n-1) + J(m-1,n) + I(m-1,n-1) - J(m-1,n-1)

На этом рисунке показано, какие пиксели включены в сумму при вычислении интегрального изображения в сером пикселе. Зеленые пикселы добавляются к сумме, а красные - вычитаются из суммы.

Суммарное интегральное изображение с поворотом

При указании изображения orientation как 'rotated'затем пиксели в интегральном изображении представляют собой суммирование соответствующего значения входного пикселя со всеми входными пикселями, которые диагонально выше входного пикселя. integralImage выполняет суммирование по диагональным линиям. Этот подход является менее вычислительным, чем поворот изображения и вычисление интегрального изображения в прямолинейных направлениях.

На чертеже текущий пиксель во входном изображении представляет собой темно-зеленый пиксель с координатой (4, 5). Все пиксели во входном изображении по диагонали над входным пикселем окрашены в светло-зеленый цвет. Суммирование значений зеленого пикселя возвращается в пикселе интегрального изображения с координатой (5, 6), окрашенной в серый цвет.

integralImage выполняет более быстрое вычисление повернутого интегрального изображения путем суммирования значений пикселей как во входном изображении, так и в интегральном изображении. Пиксель (m, n) в интегральном изображении J является линейной комбинацией только пяти пикселей: два из входного изображения и три ранее рассчитанных пикселя из интегрального изображения:

J(m,n) = J(m-1,n-1) + J(m-1,n+1) - J(m-2,n) + I(m-1,n-1) + I(m-2,n-1)

На этом рисунке показано, какие пиксели включены в сумму при вычислении интегрального изображения в сером пикселе. Зеленые пикселы добавляются к сумме, а красные - вычитаются из суммы.

Суммирование субрегиона изображения

Субрегион в вертикальной ориентации с координатой сверху слева (m,n), высота h, и ширина w в исходном изображении имеет суммирование:

regionSum = J(m–1,n–1) + J(m+h–1,n+w–1) – J(m+h–1,n–1) – J(m-1,n+w-1)

Например, во входном изображении ниже суммирование синей затененной области составляет: 46 - 22 - 20 + 10 = 14. Вычисление вычитает области выше и слева от затененной области. Область перекрытия добавляется обратно для компенсации двойного вычитания.

Для субрегиона с повернутой ориентацией используется другое определение высоты и ширины [2]. Итог области:

regionSum = J(m+h+w,n-h+w+1) + J(m,n+1) - J(m+h,n-h+1) - J(m+w,n+w+1)

Ссылки

[1] Виола, П. и М. Дж. Джонс. «Быстрое обнаружение объектов с помощью увеличенного каскада простых функций». Материалы Конференции компьютерного общества IEEE 2001 года по компьютерному зрению и распознаванию образов. 2001. Том 1, стр. 511-518.

[2] Lienhart, R. и Дж. Майдт. «Расширенный набор Haar-подобных функций для быстрого обнаружения объектов». Материалы Международной конференции IEEE 2002 года по обработке изображений. Сентябрь 2002 года. Том 1, стр. 900-903.

Расширенные возможности

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

.
Представлен в R2015b