Оглавление
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 шаг за шагом. Интегральное изображение”»
Огромное спасибо за прекрасные примеры и объяснения, просвятился аш свечусь 🙂
С нетерпением жду продолжения(больше всего детектирование лица, в видео потоке)
Еще раз огромное спасибо.