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

18

我只是想搞清楚一个概念 - 访问cv :: Mat的所有矩阵元素是否意味着我实际上正在访问图像(灰度 - 1通道和彩色 - 3通道)的所有像素值?例如,假设我的打印灰度矩阵值的代码是针对加载了类型为CV_32FC1的1通道图像的,则这是否意味着我仅访问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图像处理,想搞清楚自己的理念。如果我错了,那么如何访问图像的每个像素值?


cv::Mat的值表示像素值。所以,你是对的。 - go4sri
2个回答

38

您正在访问矩阵的元素和图片本身。在您的代码中,在执行以下操作后:

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

矩阵图像代表着图片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。


5
应该是:img.at<uchar>(i,j) = 255; //白色 (行/列错误) - berak
@Barshan Das,您能详细说明一下“但是对于单通道灰度图像,它是CV_8UC1而不是CV_32FC1”的意思吗?这是什么意思? - user227666
@user227666:我想说的是,对于一通道灰度图像,每个像素值是8位无符号字符,而不是32位无符号浮点数。 - Barshan Das
在CLion中为像素分配值给了我SIGABRT。 - piepi

16

为了获取灰度图像的像素值(一个介于0和255之间的整数),答案还需要进行类型转换。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接