空间域图像增强:OpenCV图像积分图算法

0.积分图算法介绍

积分图(integral image)算法是图像处理中的经典算法之一,由Crow在1984年首次提出,它是为了在多尺度透视投影中提高渲染速度。

积分图算法是一种快速计算图像区域和以及图像区域平方和的算法。直白的说,就是很快计算一幅图像任意区域,也就是卷积区域下的像素值的和跟平方和它的核心思想就是对每一个图像建立起自己的积分图查找表,在图像处理的阶段就可以根据预先建立积分图查找表直接查找从而实现对均值卷积的线性时间计算,做到了卷积执行的时间与半径窗口大小的无关联。

这种算法被应用到基于NCC的快速匹配、对象检测和SURF变换中、基于统计学的快速滤波器等方面。第一个应用积分图像技术的应用是在Viola-Jones的对象检测框架中出现。

1.图像积分图的建立与查找

1.1积分图的建立

图像积分图是根据原图像像素值而计算建立出来的,假设原图的大小为 W ∗ H W*H WH,则积分图的大小为 ( W + 1 ) ∗ ( H + 1 ) (W+1)*(H+1) (W+1)(H+1)。在积分图上任意坐标 ( x , y ) (x,y) xy处的 i i ( x , y ii(x,y iixy)即表示原图中坐标为 ( x , y ) (x,y) xy的点的左上角所有像素点像素值的和(平方和表中的就是平方和)。

和表和平方和表建立公式如下:
和表:
在这里插入图片描述
平方和表:
在这里插入图片描述

举个栗子,假设输入图像为2x2大小的,则积分图为3x3大小。如下图:
在这里插入图片描述

1.2积分图的查找

在这里插入图片描述
如上图,根据输入图像得到该图像的积分图之后,如果想求输入图像中的蓝色区域内的像素值之和:
3 + 2 + 5 + 4 = 14 3+2+5+4=14 3+2+5+4=14
只要根据每个点左上方所有像素值和表值进行两次减法和一次减法即可:
46 − 22 − 20 + 10 = 14 46-22-20+10=14 462220+10=14
也就是右下角+左上角-右上角和左下角。

这样对于任意大小的区域,实际上只要进行两次减法和一次加法就可以计算出区域内像素值之和。

2.OpenCV积分图api

OpenCV中计算积分图的C++ api原型如下:

void integral( InputArray src, //输入图像
			   OutputArray sum,//和表
               OutputArray sqsum,//平方和表
               int sdepth = -1,		//和表深度
               int sqdepth = -1 );		//平方和表深度

其中 src为输入图像, sum就是和表, sqsum是平方和表, sdepth是和表深度,一般用 CV_32Ssqdepth是平方和表深度,一般为 CV_32F

举个栗子,获取输入图像的积分图代码如下:

Mat input_image = imread("./whisper.jpg", 1);
if (input_image.empty())
{
	cout << "read input error!" << endl;
	return -1;
}
imshow("input", input_image);
Mat sum, sqrsum;
integral(input_image, sum, sqrsum, CV_32S, CV_32F);

sumsqrsum即分别为和表和平方和表。得到积分和图表后就可以根据上面的积分图查表方法编写get_block_sum()函数来获取指定区域内像素点的像素值之和:

int get_block_sum(Mat &sum, int x1, int y1, int x2, int y2, int i)
{
	int tl = sum.at<Vec3i>(y1, x1)[i];
	int tr = sum.at<Vec3i>(y2, x1)[i];
	int bl = sum.at<Vec3i>(y1, x2)[i];
	int br = sum.at<Vec3i>(y2, x2)[i];
	int sum_value = (br - bl - tr + tl);
	return sum_value;
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值