求图片积分图片

5分钟内设计师响应
十年专注设计领域
费用最多可节约50%
相关“积分卡”2544 张图片
相关素材精精精精精5060708090100每页显示红动创办于2005年,老品牌值得信赖
在线客服 :
客服热线 :图像处理(6)
机器视觉(2)
前段时间我开始学习特征提取方面的东西,看到相关的Paper提到了积分图的概念,就自己编码实现了一下
Porikli F. Integral histogram: A fast way to extract histograms in cartesian spaces[C]//Computer Vision and Pattern Recognition, 2005. CVPR 2005. IEEE Computer Society Conference on. IEEE, 9-836.
这篇Paper中罗里吧嗦给出了一种积分图的快速算法(请原谅我的肤浅,只看懂了灰度特征的积分图),示意图如下:
H(x1,x2,b)=H(x1-1,x2,b)+H(x1,x2-1,b)-H(x1-1,x2-1,b)+Q(f(x1,x2))(1)
他这个公式太高深,咱们就肤浅一点,假如只看灰度特征,意思就是
当前像素的积分值=左边像素积分值+右边像素积分值-左上角像素积分值+当前像素灰度值(2)
为了加深理解,请看下图(图是我盗的^_^):
Integral(i,j)=Integral(i,j-1)+Integral(i-1,j)-Integral(i-1,j-1)+Image(i,j)(3)
如果要求从(i,j)到(i+m,j+n)两个像素构成的矩形区域的直方图,只需再以上积分图的基础上(此处有误,待修改)
Hist(m,n)(i,j)=Integral(i+m,j+n)-Integral(i,j)(4)
即可,非常方便,适用于大量的需要求取局部直方图的场合
但是,仔细看看那个求积分图的过程发现,其实不用分成4部分来进行,只需要2部分就可以了,那就是
当前像素的积分值=左边像素的积分值+当前像素所在列的积分值(5)
这是什么意思呢,请看下图(借的图^_^):
Integral(i,j)=Integral(i,j-1)+ColumnSum(j)(6)
(⊙v⊙)嗯,看着还不错哦,貌似一下子简化了很多恩。
(这个概念当初上课时老师提过积分图的概念,也提过原始的算法,更给我们说了这种很简单的算法,还说这个算法他早都发现了,只是没发表论文,不然也会是一片惊天地泣鬼神的作品,,,,这几天当我刚发现这个问题的时候,心里已经万马奔腾了,不错,他在装,,,,)
为什么会是这样呢,,,
想想看,一副M×N的图片,从左至右,从上到下的计算积分图,每个像素需要做:2次加法和一个减法(不考虑第一行和第一列像素),即复杂度O(3×M×N)
再看看那个所谓的改进的快速算法,每个像素需要做:2次加法(不考虑第一行像素),即复杂度O(2×M×N)
有问题么??????
有,你把ColumnSum的计算复杂度给吃啦?
这样,把ColumnSum也按照积分图的思想做成累积的形式,,,那么计算ColumnSum的复杂度为O(M×N),为什么是这样?因为你计算ColumnSum是个累计列和的向量啊,长度为N,图像总共M行,没一行时ColumnSum总得更新吧,,,,
那么那个所谓的改进的快速算法复杂度时多少?
答:O(3×M×N)
那么下面编程实现,并测试一下:
void integralMap(unsigned char *pImg, int width, int height, int *integmap)
int index,
unsigned char *pCur,*pE
memset(integmap,0,sizeof(int)*width*height);
for(sum=0,pCur=pImg,pEnd=pImg+width,piCur=pCur&pEpCur++,piCur++)
for(sum=0,pCur=pImg,pEnd=pImg+width*height,piCur=pCur&pEpCur+=width,piCur+=width)
for(sum=0,index=0,pCur=pImg+width+1,pEnd=pImg+width*height,piCur=integmap+width+1;pCur&pE)
*piCur=*pCur+*(piCur-1)+*(piCur-width)-*(piCur-width-1);
if(index == width-1)
void integralMapFast(unsigned char *pImg, int width, int height, int *integmap)
unsigned char *pCur,*pE
int *colsum,*
colsum = (int*)malloc(sizeof(int)*width);
memset(colsum,0,sizeof(int)*width);
memset(integmap,0,sizeof(int)*width*height);
for(sum=0,pCur=pImg,pEnd=pImg+width,piCur=integmap,pc=pCur&pEpCur++,piCur++,pc++)
for(i=0,pCur=pImg+width,pEnd=pImg+width*height,piCur=integmap+width,pc=pCur&pEpCur++,piCur++,pc++)
*piCur=*pc+*(piCur-1);
if(i==width)
free(colsum);
下面是测试结果(我用到Ubuntu,可以精确到微秒):
可以看出来,那个所谓的改进的快速算法并不快,反而还要慢,,因为需要为ColumnSum分配空间,还要对其寻址,,,,这都是额外的系统开销,慢是必然的,,,
好了,就酱紫,, ,如果我的算法和理解方法有误,还望不吝指正,我是新手
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:11092次
排名:千里之外
原创:11篇
(1)(1)(1)(4)(4)求图片中那个函数的积分是啥。不好意思忘了补充。不能把(1-x)^a&拆开来。要简单的表示
将(1-x)^a按二项式定理展开,即Ca(0)-Ca(1)x+...+Ca(i)(-1)^i·x^i+...+(-1)^a·x^a再逐项与x^b相乘然后逐项按幂函数求积分就行了 或者用分部积分,为∫f(x)dx=[1/(b+1)]∫(1+x)^a dx^(b+1)=[1/(b+1)][(1+x)^a ·x^(b+1) -a·∫(1+x)^(a-1)·x^(b+1)dx]然后用同样的方法对∫(1+x)^(a-1)·x^(b+1)dx进行分部积分,直到(1+x)的指数为0,则x的指数为b+a则最后剩下的积分就是∫x^(b+a)dx=[1/(a+b+1)]x^(a+b+1)其间的环节性系数的规律可以较容易推导出来.我个人认为还是按二项式定理展开的方法比这种方法的计算量要少一些.第三种方法是用三角函数代换,即令x=sin^2 u.则dx=2sinu·cosu·du 不过这需要大量的讨论各种有关a,b奇偶的情况,还要用到半角,倍角公式,最后把u换回成x时还要代入许多反三角函数,也不会很简单.而且也容易产生错误.
为您推荐:
其他类似问题
问题是啥啊??
如果告诉了积分区间[a,b],那么函数的积分就表示三条直线x=a,x=b,x轴和函数f(x)为曲边所围成的曲边梯形的面积。
扫描下载二维码求图片的积分,先谢谢啦_百度知道}

我要回帖

更多关于 积分商城图片 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信