目录
在图像处理中,积分图的应用在某些场合可以带来极高的效率优化,但是积分图本身的计算比较耗时,需要优化。
积分图用double类型:
void IntegralF64(Mat src, Mat &integal_out)
{
Mat tmp(src.size(), CV_64FC1, 0.0);
tmp.ptr<double>(0)[0] = (double)src.ptr<uchar>(0)[0];
for (int i = 1; i < src.cols; i++) //第一行
{
tmp.ptr<double>(0)[i] = tmp.ptr<double>(0)[i - 1] + src.ptr<uchar>(0)[i];
}
for (int i = 1; i < src.rows; i++) //第一列
{
tmp.ptr<double>(i)[0] = tmp.ptr<double>(i - 1)[0] + src.ptr<uchar>(i)[0];
}
for (int i = 1; i < src.rows; i++) //第i行
{
for (int j = 1; j < src.cols; j++) //第j列
{
tmp.ptr<double>(i)[j] = tmp.ptr<double>(i)[j - 1] + tmp.ptr<double>(i - 1)[j] - tmp.ptr<double>(i - 1)[j - 1] + src.ptr<uchar>(i)[j];
}
}
tmp.copyTo(integal_out);
}
该方法,对4k*2k的图,耗时在70ms。
积分图用float类型:
void IntegralF32(Mat src, Mat &integal_out)
{
Mat tmp(src.size(), CV_32FC1, 0.0);
tmp.ptr<float>(0)[0] = (float)src.ptr<uchar>(0)[0];
for (int i = 1; i < src.cols; i++) //第一行
{
tmp.ptr<float>(0)[i] = tmp.ptr<float>(0)[i - 1] + src.ptr<uchar>(0)[i];
}
for (int i = 1; i < src.rows; i++) //第一列
{