分享

积分图的概念、计算及代码

 木俊 2018-06-29
对于一幅灰度图像,积分图像中的任意一点(x,y)的值是指从图像的左上角到这个点的所构成的矩形区域内所有的点的灰度值之和:
I表示积分图像,G表示原始图像。则 I(x,y)=sum(G(i,j)),其中 0<=i<=x,0<=j<=y.
在实际的计算过程中,对于一个点(x,y)的值等于:
I(x,y)=I(x-1,y)+I(x,y-1)-I(x-1,y-1)+G(i,j) (I:该点的积分图像值,G:该点的灰度值)
在实际的编程实现过程中可以对有图像的大小进行扩展,左边扩展一列,顶端扩展一行, 即:I(-1,j)=0,I(i,-1)=0;
快速算法:
s(x,y) = s(x,y-1) + i(x,y);
ii(x,y) = ii(x-1,y) + s(x,y)
其中s(x,y)是列的积分值,i(x,y)是原始图像的灰度值,ii(x,y)是积分图的最终值。
  1. #include<opencv2\core\core.hpp>
  2. #include<opencv2\highgui\highgui.hpp>
  3. #include<opencv2\imgproc\imgproc.hpp>
  4. #include<iostream>
  5. using namespace std;
  6. using namespace cv;
  7. int main(int argc,char* argv[])
  8. {
  9. //读取图像
  10. Mat image;
  11. image=imread("lena.bmp",IMREAD_COLOR);
  12. if(image.empty())
  13. {
  14. cerr<<"Failure in loading image"<<endl;
  15. return -1;
  16. }
  17. //转换成灰度图像
  18. Mat grayImage;
  19. cvtColor(image,grayImage,COLOR_BGR2GRAY);
  20. //定义、计算积分图像,积分图像比灰度图像多一行一列
  21. Mat integralImage=Mat::zeros(grayImage.rows+1,grayImage.cols+1,CV_32SC1);
  22. for(int i=0;i<grayImage.rows;i++)
  23. {
  24. for(int j=0;j<grayImage.cols;j++)
  25. {
  26. integralImage.at<int>(i+1,j+1)=integralImage.at<int>(i,j+1)
  27. +integralImage.at<int>(i+1,j)
  28. -integralImage.at<int>(i,j)
  29. +grayImage.at<unsigned char>(i,j);
  30. }
  31. }
  32. //真正的积分图像
  33. Mat realIntegralImage=integralImage(Range(1,integralImage.rows),Range(1,integralImage.cols));
  34. /*cout<<realIntegralImage.row(0)<<endl;*/
  35. //Opencv中自带的积分图像计算
  36. Mat integralImage_integral;
  37. integral(grayImage,integralImage_integral);
  38. //下面两行代码用来对比自己的积分图像和Opencv自己计算的积分图像是否一样
  39. //cout<<integralImage.row(1)<<endl;
  40. //cout<<integralImage_integral.row(1)<<endl;
  41. imshow("src",image);
  42. imshow("gray",grayImage);
  43. waitKey(0);
  44. return 0;
  45. }


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多