Integray Image(积分图)

来源:互联网 发布:linux nslookup mx 编辑:程序博客网 时间:2024/05/22 00:21

在研究openTLD中的varianceFilter时发现了一个术语,Integray Image,这里做个记录,以免忘记

积分图的定义(百度百科):

对于一幅灰度的图像,积分图像中的任意一点(x,y)的值是指从图像的左上角到这个点的所构成的矩形区域内所有的点的灰度值之和。

使用Integray Image的主要目标是为了减少计算量,在很多算法中,图像需要做重复的累加工作,如果每次都重新进行累加,会较浪费时间,所以可以先制作一副积分图,当需要某块区域的累加时,使用积分图可以简单的获取。

在Georg大大版本openTLD中计算积分图的代码:

template <class T>class IntegralImage{public:    T *data;  /* Array containg the entries for the integral image in row-first manner. Of size width*height. Allocated by tldAllocIntImg */    /* width, height: Dimensions of integral image.*/    int width;    int height;    IntegralImage(cv::Size size)    {        data = new T[size.width * size.height];    }    virtual ~IntegralImage()    {        delete[] data;    }    void calcIntImg(const cv::Mat &img, bool squared = false)    {        const unsigned char *input = (const unsigned char *)(img.data);        T *output = data;        for(int i = 0; i < img.cols; i++)        {            for(int j = 0; j < img.rows; j++)            {                T A = (i > 0) ? output[img.cols * j + i - 1] : 0;                T B = (j > 0) ? output[img.cols * (j - 1) + i] : 0;                T C = (j > 0 && i > 0) ? output[img.cols * (j - 1) + i - 1] : 0;                T value = input[img.step * j + i];                if(squared)                {                    value = value * value;                }                output[img.cols * j + i] = A + B - C + value;            }        }    }};
代码比较简单,积分图上某一点的值等于这个点向左的一个点的值(A)+向上一个点的值(B)-左上那个点的值(C)+原图中这个点的值(value),代码中的square选项如果为true则可以得出平方值的积分图,因为原程序中这里是用来求方差的,所以需要求一张普通的积分图和一张平方后的积分图。


0 0
原创粉丝点击