有关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区域的像素和为:
为防止溢出,积分图像的值通常采用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区域的像素和为:
相关文章推荐
- 基础学习笔记之opencv(12):改变图像对比度和亮度
- OpenCV学习笔记(12)-朴素贝叶斯分类
- opencv学习---计算图像的水平积分投影和垂直积分投影
- 有关opencv的学习(2)—在图像中加入椒盐噪声
- 有关opencv的学习(1)—图片显示
- OpenCV学习笔记(12)OpenCV调用Matlab函数进行保存视频的尝试
- 有关opencv的学习(6)—图像的HSV色彩空间
- OpenCV学习12
- 有关OpenCV1.0中GUI命令的几个函数学习总结
- 有关opencv的学习(4)—图像的锐化
- OpenCV学习笔记(12)-二叉决策树
- 黑马程序员—12—java基础:有关字符串的学习笔记和学习心得体会
- Opencv2系列学习笔记12(检测fast特征)
- opencv学习---计算图像的水平积分投影和垂直积分投影
- OpenCV官方文档学习记录(12)
- 基础学习笔记之opencv(19):有关图像序列的直方图计算
- opencv学习_12 (harris角点检测)
- OpenCV学习笔记12 OpenCV图像处理模块ImgProc Module. Image Processing(五)
- opencv学习_12 (harris角点检测)
- 有关opencv的学习(5)—图像的重映射