29. OpenCV шаг за шагом. Интегральное изображение



Оглавление
1. OpenCV шаг за шагом. Введение.
2. Установка.
3. Hello World.
4. Загрузка картинки.

26. Операторы Собеля и Лапласа
27. Детектор границ Кенни (Canny)
28. Преобразование Хафа
29. Интегральное изображение

Раз уж мы научились брать производную от изображения, то было бы неплохо брать и интеграл изображения 🙂

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

II(x,y) = Summ( I(i,j) )

, где I(i,j) — яркость пикселя исходного изображения.

Т.о., каждый элемент интегрального изображения II[x,y] содержит в себе сумму пикселей изображения в прямоугольнике от (0,0) до (x,y).
Рассчет интегрального изображения занимает линейное время, пропорциональное числу пикселей исходного изображении.

Рассчет интегрального изображения II можно производить по рекуррентной формуле:

II(x,y) = I(x,y) — II(x-1,y-1) + II(x,y-1) + II(x-1,y)

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

Например, интересующий нас прямоугольник ABCD:

Сумму внутри прямоугольника можно выразить через суммы и разности смежных прямоугольников по формуле:

SumOfRect(ABCD) = II(A) + II(С) — II(B) — II(D)

Не верится? Возьмём в руки Excel и проверим:

В OpenCV для подсчёта интегрального изображения уже есть функция cvIntegral():

#define cvIntegralImage     cvIntegral

CVAPI(void) cvIntegral( const CvArr* image, CvArr* sum,
                       CvArr* sqsum CV_DEFAULT(NULL),
                       CvArr* tilted_sum CV_DEFAULT(NULL));

— вычисление интегрального представления изображения (integral image) по формуле:

SUM(X,Y) = sum(x<X,y<Y)I(x,y)

image — исходное изображение WxH, 8-битное или 32F, 64F
sum — интегральное представление (W+1)x(H+1), 32F или 64F
sqsum — интегральное представление для квадрата величин пикселей (W+1)x(H+1), 64F
tilted_sum — интегральное представление для изображения, повёрнутого на 45 градусов, тип аналогичен sum

формулы:

	sum(X,Y) = Summ( I(x,y) )
	sqsum(X,Y) = Summ( I(x,y)^2)

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

Пример:

//
// интегральное изображение cvIntegral()
//
// https://robocraft.ru
//

#include <cv.h>
#include <highgui.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
	IplImage *src=0, *dst=0, *dst2=0, *dst3=0;

	// имя картинки задаётся первым параметром
	char* filename = argc >= 2 ? argv[1] : "Image0.jpg";
	// получаем картинку
	src = cvLoadImage(filename, 0);

	printf("[i] image: %s\n", filename);
	assert( src != 0 );

	// покажем изображение
	cvNamedWindow( "original", 1 );
	cvShowImage( "original", src );

	dst = cvCreateImage( cvSize(src->width+1, src->height+1), IPL_DEPTH_64F, 1);
	dst2 = cvCreateImage( cvSize(src->width+1, src->height+1), IPL_DEPTH_64F, 1);
	dst3 = cvCreateImage( cvSize(src->width+1, src->height+1), IPL_DEPTH_64F, 1);

	// получаем интегральное изображение
	cvIntegral(src, dst, dst2, dst3);

	cvNamedWindow( "cvIntegral", 1 );
	cvShowImage( "cvIntegral", dst );
	cvNamedWindow( "cvIntegral 2", 1 );
	cvShowImage( "cvIntegral 2", dst2 );
	cvNamedWindow( "cvIntegral tilted");
	cvShowImage( "cvIntegral tilted", dst3 );

	// ждём нажатия клавиши
	cvWaitKey(0);

	// освобождаем ресурсы
	cvReleaseImage(&src);
	cvReleaseImage(&dst);
	cvReleaseImage(&dst2);
	// удаляем окна
	cvDestroyAllWindows();
	return 0;
}

скачать иcходник (29-cvIntegral.cpp)

Применение:
интегральное изображение использутся для быстрого вычисления яркости заданных участков изображения ( в вейвлет-преобразованиях, фильтрах Хаара, рассчёте дескрипторов (SURF)).

Далее: Трансформация изображения — аффинные преобразования, гомография

Ссылки
Интегральное представление изображений
http://en.wikipedia.org/wiki/Summed_area_table


0 комментариев на «“29. OpenCV шаг за шагом. Интегральное изображение”»

  1. Огромное спасибо за прекрасные примеры и объяснения, просвятился аш свечусь 🙂
    С нетерпением жду продолжения(больше всего детектирование лица, в видео потоке)
    Еще раз огромное спасибо.

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение