访问OpenCV中灰度图像的像素值

时间:2013-07-29 08:36:23

标签: c++ opencv image-processing

我只想明白我的概念 - 访问cv :: Mat的所有矩阵元素意味着我实际上正在访问图像的所有像素值(灰度 - 1通道和彩色 - 3通道)?就像假设我的代码用于打印加载1通道图像并键入CV_32FC1的灰度矩阵的值,如下所示,那么这是否意味着我只访问cv :: mat的成员或者我正在访问图像的像素值(1通道 - 灰度和CV_32FC1型)也是?

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

我对使用OpenCV进行图像处理非常陌生,并想清除我的想法。如果我错了,那么如何访问图像的每个像素值?

2 个答案:

答案 0 :(得分:27)

您正在访问矩阵的元素,您也正在访问图像本身。在您的代码中,执行此操作后:

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

矩阵img代表图像lenna.png。 (如果成功打开)

为什么不通过更改某些像素值来体验自己:

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

注意:这只会更改易失性内存中的图像值,即当前加载mat img的位置。修改mat img的值,不会改变存储在磁盘中的实际图像“lenna.png”中的值(除非你是imwrite)

但是对于1通道灰度图像,它是CV_8UC1而不是CV_32FC1

答案 1 :(得分:5)

为了获得灰度图像的像素值(0到255之间的整数),答案也需要进行类型转换。

int pixelValue = (int)img.at<uchar>(i,j);
相关问题