15

我只是想让我的概念清楚 - 正在访问 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 进行图像处理很陌生,想弄清楚我的想法。如果我错了,那么如何访问图像的每个像素值?

4

2 回答 2

32

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

 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

于 2013-07-29T08:49:25.573 回答
10

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

int pixelValue = (int)img.at<uchar>(i,j);
于 2016-07-19T07:36:44.847 回答