11 votes

Somme de chaque colonne opencv

En Matlab, si A est une matrice, sum(A) traite les colonnes de A comme des vecteurs, renvoyant un vecteur ligne des sommes de chaque colonne.

sum(Image) ; Comment faire avec OpenCV ?

33voto

Srinath Sridhar Points 902

Utilisation de cvReduce a fonctionné pour moi. Par exemple, si vous avez besoin de stocker la somme en colonnes d'une matrice en tant que matrice de lignes, vous pouvez procéder comme suit :

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);

De plus amples informations sont disponibles dans le Documentation OpenCV .

3voto

Valentin Heinitz Points 1231

EDIT après 3 ans :

La fonction appropriée pour cela est cv::reduce .

Réduit une matrice en un vecteur.

La fonction reduce réduit la matrice en un vecteur en traitant la fonction lignes/colonnes de la matrice comme un ensemble de vecteurs 1D et en effectuant l'opération l'opération spécifiée sur les vecteurs jusqu'à l'obtention d'une seule ligne/colonne soit obtenue. Par exemple, la fonction peut être utilisée pour calculer les valeurs de préréglage horizontal et verticales d'une image matricielle. Dans le cas de REDUCE_MAX et de REDUCE_MIN , l'image de sortie doit avoir le même type que l'image source. source. Dans le cas de REDUCE_SUM et REDUCE_AVG , la sortie peut avoir une plus grande la sortie peut avoir une plus grande profondeur de bit d'élément pour préserver la précision. Et les tableaux multicanaux sont également supportés dans ces deux modes de réduction.

OLD : J'ai utilisé la méthode ROI : déplacer le ROI de la hauteur de l'image et de la largeur 1 de gauche à droite et calculer les moyennes.

 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-stripeIntensity graph

EDIT : Juste par curiosité, j'ai essayé de redimensionner en hauteur 1 et le résultat était presque le même :

 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

2voto

CvSum respecte le ROI, donc si vous déplacez une fenêtre de 1 px de large sur toute l'image, vous pouvez calculer la somme de chaque colonne.

Mon c++ s'est un peu rouillé et je ne fournirai donc pas d'exemple de code, bien que la dernière fois que j'ai fait cela, j'ai utilisé OpenCVSharp et cela a bien fonctionné. Cependant, je ne suis pas sûr de l'efficacité de cette méthode.

Mes compétences en mathématiques commencent à s'émousser, mais ne devrait-on pas pouvoir additionner tous les éléments des colonnes d'une matrice en la multipliant par un vecteur de 1 ?

0voto

Sean Points 1354

Pour une image en niveaux de gris 8 bits, la méthode suivante devrait fonctionner (je pense). Il ne devrait pas être trop difficile de l'étendre à d'autres types d'images.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X