您的位置:首页 > 运维架构

有关opencv的学习(12)—积分图

2017-03-17 22:12 239 查看
       取图像左上侧的全部像素计算累加和,并用这个累加和替换图像中的每一个像素,用这种方式得到的图像称为积分图像。计算积分图像时只需对图像扫描一次。这是因为当前像素的积分值等于上一像素的积分值加上当前行的累计值。因此积分图像就是一个包含像素累加和的新图像。

       为防止溢出,积分图像的值通常采用int类型(CV_32S)或float类型(CV_32F)。例如下图中,积分图像的像素A包含左上角区域,即双阴影线图案标识的区域的像素的累加和。



       计算完积分图像后,只需要访问四个像素就可以得到任何矩形区域的像素累加和。这里解释一下原因。再来看前面的图片,计算由A、B、C、D四个像素表示区域的像素累加和,先读取D的积分值,然后减去B的像素值和C的左手边区域的像素值。但是这样就把A左上角的像素累加和减了两次,因此需要重新加上A的积分值。所以计算A、B、C、D区域内的像素累加的正式公式为:A
- B - C + D。

      下面例子中我们使用如下图片,积分图的“兴趣区域”——ROI为图中方框部分:



代码如下:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui
4000
.hpp>
#include <opencv2/opencv.hpp>
//#include "onMouse.h"

using namespace cv;
using namespace std;

int main()
{
Mat image=imread("/Users/zhangxiaoyu/Desktop/2.png",0);//0为读出的是灰度图像

if(image.empty())
{
cout<<"Error!cannot be read...../n";
return -1;
}

//定义图像的ROI-area of interest
int x0=180,y0=250;
int height=65,width=45;

cv::Mat roi(image,cv::Rect(x0,y0,width,height));

//计算积分图像
cv::Mat integralImage;
cv::integral(image, integralImage, CV_32S);

//用三个加/减运算得到一个区域的累加值
int sum=integralImage.at<int>(y0+height,x0+width)
-integralImage.at<int>(y0+height,x0)
-integralImage.at<int>(y0,x0+width)
+integralImage.at<int>(y0,x0);

std::cout<<"the sum of ROI is "<<sum<<std::endl;

return 0;

}


运行程序,计算ROI区域的像素和为:



    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: