积分图的实现

//改进的计算像素灰度值积分图像
//image_Src:灰度图
//image_Integral:image_Src大小相同的CV_32SC1类型
//方法:Integral(y,x) = Integral(y-1,x) + rowSum(y);
void CalculateIntegralImage(const Mat &image_Src,Mat &image_Integral)
{
	////////////step 1.重新分配图像(如果需要)/////////////////
	//新图像的大小
	int width_Dst=image_Src.cols;
	int height_Dst=image_Src.rows;
	image_Integral.create(Size(width_Dst,height_Dst),CV_32SC1);//如果重新分配,之前的空间会扔掉
	image_Integral.setTo(Scalar(0));

	////////step 2.计算积分图////////////////////////
	//参数
	int widthStep_Src=image_Src.step1(0);//行的通道数,这里一定要注意!!!
	int widthStep_Integral=image_Integral.step1(0);//行的通道数

	int channelCount_Src=image_Src.step1(1);//每个点的通道数
	int channelCount_Integral=image_Integral.step1(1);//每个点的通道数

	//第一行
	uchar *row_Src=image_Src.data;
	int *row_Integral=(int *)image_Integral.data;//注意指针的转换
	for (int y=0;y<=image_Src.rows-1;++y)
	{
		int sum=0;//当前行的累加和
		//列
		uchar *col_Src=row_Src;
		int *col_Integral=row_Integral;
		for (int x=0;x<=image_Src.cols-1;++x)
		{
			//该行的累加
			sum+=col_Src[0];

			//计算第0行,第一行单独处理
			if (y==0)
			{
				col_Integral[0]=sum;
			}
			else
			{
				//非第0行
				//当前行累加和+同列的上一个元素的值
				col_Integral[0]=sum+col_Integral[0-widthStep_Integral];//下标
				//col_Integral[0]=sum+*(col_Integral-image_Integral.cols);//指针移动

			}

			//下一个像素
			col_Src++;
			col_Integral++;

		}
		//下一行
		row_Src+=widthStep_Src;
		row_Integral+=widthStep_Integral;
	}

}
时间: 2024-10-25 18:24:24

积分图的实现的相关文章

【练习6.14】积分图像cvIntegral及使用积分图的性质找横向和纵向边,IplImage结构中widthStep细节

提纲 题目要求 程序代码 结果图片 要言妙道 题目要求: 加载一副灰度图,得到它的积分图.利用积分图的性质找到图像里的横向和纵向边缘. 利用细长的矩形,在适当的位置减去或加上它们. 备注:边缘查找尚未加入代码 程序代码: 1 // OpenCVExerciseTesting.cpp : 定义控制台应用程序的入口点. 2 // 3 //D:\\Work\\Work_Programming\\Source\\Image\\lena.jpg 4 5 #include "stdafx.h" 6

图像处理之积分图应用四(基于局部均值的图像二值化算法)

图像处理之积分图应用四(基于局部均值的图像二值化算法) 基本原理 均值法,选择的阈值是局部范围内像素的灰度均值(gray mean),该方法的一个变种是用常量C减去均值Mean,然后根据均值实现如下操作: pixel = (pixel > (mean - c)) ? object : background 其中默认情况下参数C取值为0.object表示前景像素,background表示背景像素. 实现步骤 1. 彩色图像转灰度图像 2. 获取灰度图像的像素数据,预计算积分图 3. 根据输入的参数

机器视觉中的图像积分图及其实现

计算机视觉中,人脸检测(Face Detection)是一项常见的任务.Paul Viola和Michael Jones在<Rapid object detection using a Boosted cascade ofsimple features>一文中提出的快速对象识别算法将人脸检测推向了一个新的高度,这种将Adaboost 和Cascade 算法综合运用的实时人脸检测系统,使人脸检测这项工作具有了更为实际的意义和价值.其中,为了加速Haar特征的计算,他们提出了积分图的概念. 坐标点

浅析人脸检测之Haar分类器方法:Haar特征、积分图、 AdaBoost 、级联

浅析人脸检测之Haar分类器方法 一.Haar分类器的前世今生 人脸检测属于计算机视觉的范畴,早期人们的主要研究方向是人脸识别,即根据人脸来识别人物的身份,后来在复杂背景下的人脸检测需求越来越大,人脸检测也逐渐作为一个单独的研究方向发展起来. 目前的人脸检测方法主要有两大类:基于知识和基于统计. Ø  基于知识的方法:主要利用先验知识将人脸看作器官特征的组合,根据眼睛.眉毛.嘴巴.鼻子等器官的特征以及相互之间的几何位置关系来检测人脸. Ø  基于统计的方法:将人脸看作一个整体的模式——二维像素矩

积分图实现均值滤波的CUDA代码

没想到我2010年买的笔记本显卡GT330M 竟然还能跑CUDA,果断小试了一把,环境为CUDA6.5+VS2012,写了一个积分图实现均值滤波.类似于OpenCV的blur()函数. 使用lena.jpg做测试,效果如下:        代码在此: #include "cuda_runtime.h" #include "device_launch_parameters.h" #include <stdio.h> #include <opencv2

机器视觉中的图像积分图及事实上现

计算机视觉中,人脸检測(Face Detection)是一项常见的任务. Paul Viola和Michael Jones在<Rapid object detection using a Boosted cascade ofsimple features>一文中提出的高速对象识别算法将人脸检測推向了一个新的高度,这样的将Adaboost 和Cascade 算法综合运用的实时人脸检測系统,使人脸检測这项工作具有了更为实际的意义和价值. 当中.为了加速Haar特征的计算,他们提出了积分图的概念.

目标检测之积分图---integral image 积分图2

前面在图像处理一栏中涉及到boxfilter 的时候,简单介绍过积分图,就是每个像素点是左边和上边的累加和,这样的话可以方便均值和方差,以及直方图统计的相关运算,这里再次结合网络资源重新单独对积分图做专门的介绍. 积分图的概念最早是由Paul Viola等人提出的,并被应用到实时的对象检测框架中.对于一个灰度图像而言,其积分图也是一张图,只不过这个图跟普通的灰度图,彩色图稍有不同.这是因为,一般我们说的灰度图.彩色图,都是相机拍摄到的真实物体在某个时刻的真实画面.而积分图虽然也可以理解为一张图,

[占坑] 图像处理中计算积分图使用类似dp的方法而不用树状数组的原因

占个坑,目前知道的几条原因: 1.dp的状态转义方程很简单:f(i,j)=f(i-1,j)+f(i,j-1)-f(i-1,j-1)+rgb(i,j),预处理复杂度是O(nm),查询的复杂度为O(1).而使用BIT的话,一般的图像RGB值非常分散,预处理的复杂度相当于往二维BIT里插入数的复杂度,是O(nmloglog(max(n,m))).这样看来的话,dp略胜一筹.不过,假如是处理二值图像的话,或许二维BIT会提速不少. 原文地址:https://www.cnblogs.com/kirai/p

OpenCV——积分图计算

1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 #include "math.h" 4 5 using namespace cv; 6 using namespace std; 7 8 int main(int argc, char** argv) { 9 Mat src = imread("test.jpg",0); 10 if (src.empty()) { 11 print