web-dev-qa-db-fra.com

accès à la valeur en pixels de l'image en niveaux de gris dans OpenCV

Je veux juste que mon concept soit clair: - est-ce que l'accès à tous les éléments matriciels de cv :: Mat signifie que j'accède en fait à toutes les valeurs de pixels d'une image (niveaux de gris - 1 canal et pour la couleur - 3 canaux)? Par exemple, supposez que mon code pour imprimer les valeurs de la matrice d'échelle de gris qui est une image de canal chargée et de type CV_32FC1, soit comme indiqué ci-dessous, cela signifie-t-il que j'accède uniquement aux membres du cv :: mat ou que j'accède au valeurs de pixels de l'image (avec 1 canal - niveaux de gris et type CV_32FC1) également?

    cv::Mat img = cv::imread("lenna.png");
    for(int j=0;j<img.rows;j++) 
    {
    for (int i=0;i<img.cols;i++)
      {
        std::cout << "Matrix of image loaded is: " << img.at<uchar>(i,j);
      }
    }

Je suis assez nouveau dans le traitement d'images avec OpenCV et je veux clarifier mon idée. Si je me trompe, comment puis-je accéder à chaque valeur de pixel d'une image?

12
user227666

Vous accédez aux éléments de la matrice et vous accédez également à l'image elle-même. Dans votre code, après cela:

 cv::Mat img = cv::imread("lenna.png");

la matrice img représente l'image lenna.png. (s'il est ouvert avec succès)

Pourquoi ne vous expérimentez-vous pas en modifiant certaines valeurs de pixels:

 cv::Mat img = cv::imread("lenna.png");
//Before changing
cv::imshow("Before",img);
//change some pixel value
for(int j=0;j<img.rows;j++) 
{
  for (int i=0;i<img.cols;i++)
  {
    if( i== j)   
       img.at<uchar>(j,i) = 255; //white
  }
}
//After changing
cv::imshow("After",img);

Remarque: cela ne change que les valeurs de l'image dans la mémoire volatile, c'est-à-dire là où le tapis img est actuellement chargé. Modifier les valeurs du mat img, ne va pas changer la valeur dans votre image réelle "lenna.png", qui est stockée sur votre disque, (sauf si vous écrivez)

Mais dans le cas d'une image en niveaux de gris à 1 canal, c'est CV_8UC1 et non CV_32FC1

27
Barshan Das

Afin d'obtenir la valeur en pixels de l'image en niveaux de gris (un entier entre 0 et 255), la réponse doit également être transtypée.

int pixelValue = (int)img.at<uchar>(i,j);
5
zeerak