每列opencv的总和

时间:2011-02-23 21:30:33

标签: opencv

在Matlab中,如果A是矩阵,则sum(A)将A的列视为向量,返回每列总和的行向量。

总和(图片);如何用OpenCV完成?

4 个答案:

答案 0 :(得分:32)

使用cvReduce对我有用。例如,如果您需要将矩阵的逐列和存储为行矩阵,则可以执行以下操作:

CvMat * MyMat = cvCreateMat(height, width, CV_64FC1);
// Fill in MyMat with some data...

CvMat * ColSum = cvCreateMat(1, MyMat->width, CV_64FC1);
cvReduce(MyMat, ColSum, 0, CV_REDUCE_SUM);

OpenCV documentation中提供了更多信息。

答案 1 :(得分:3)

3年后编辑:

适当的功能是cv::reduce

  

将矩阵缩小为矢量。

     

函数reduce通过处理函数将矩阵减少为向量   矩阵行/列作为一组1D向量并执行   对向量的指定操作,直到单个行/列为止   获得。例如,该函数可用于计算水平   和光栅图像的垂直投影。如果是REDUCE_MAX和   REDUCE_MIN,输出图像应与源相同   一。在REDUCE_SUM和REDUCE_AVG的情况下,输出可以具有   较大的元素位深度以保持准确性。和多渠道   这两种缩减模式也支持数组。

<强> OLD : 我使用了ROI方法:移动图像高度的ROI和从左到右的宽度1并计算均值。

 Mat src = imread(filename, 0);     
 vector<int> graph( src.cols );
 for (int c=0; c<src.cols-1; c++)
 {
     Mat roi = src( Rect( c,0,1,src.rows ) );
     graph[c] = int(mean(roi)[0]);
 }

 Mat mgraph(  260, src.cols+10, CV_8UC3); 
 for (int c=0; c<src.cols-1; c++)
 {
     line( mgraph, Point(c+5,0), Point(c+5,graph[c]), Scalar(255,0,0), 1, CV_AA);    
 }

 imshow("mgraph", mgraph);
 imshow("source", src);

BLOT-stripe Intensity graph

修改 出于好奇,我尝试调整高度1,结果几乎相同:

 Mat test;
 cv::resize(src,test,Size( src.cols,1 ));
 Mat mgraph1(  260, src.cols+10, CV_8UC3); 
 for(int c=0; c<test.cols; c++) 
 {
        graph[c] = test.at<uchar>(0,c);
 }
 for (int c=0; c<src.cols-1; c++)
 {
     line( mgraph1, Point(c+5,0), Point(c+5,graph[c]), Scalar(255,255,0), 1, CV_AA);     
 }
 imshow("mgraph1", mgraph1);

Cols mean graph by resizing to height 1

答案 2 :(得分:2)

cvSum尊重ROI,因此如果您在整个图像上移动1 px宽的窗口,则可以计算每列的总和。

我的c ++有点生疏所以我不会提供代码示例,虽然上次我这样做时我使用的是OpenCVSharp并且工作正常。但是,我不确定这种方法的效率如何。

我的数学技能也变得生疏,但是不应该通过将它乘以1的向量来对矩阵中列中的所有元素求和吗?

答案 3 :(得分:0)

对于8位灰度图像,以下应该可以工作(我认为)。 扩展到不同的图像类型应该不会太难。

int imgStep = image->widthStep;
uchar* imageData = (uchar*)image->imageData;
uint result[image->width];
memset(result, 0, sizeof(uchar) * image->width);
for (int col = 0; col < image->width; col++) {
  for (int row = 0; row < image->height; row++) {
    result[col] += imageData[row * imgStep + col];
  }
}

// your desired vector is in result