2013-07-29 119 views
9

我只想让我的概念清楚 - 访问cv :: Mat的所有矩阵元素意味着我实际上访问图像的所有像素值(灰度 - 1通道和颜色-3通道)?就像我的代码打印加载的1通道图像的灰度矩阵的值和类型CV_32FC1,如下所示,那么这是否意味着我只访问cv :: mat的成员,或者我正在访问图像的像素值(1通道 - 灰度和类型CV_32FC1)也?访问OpenCV中灰度图像的像素值

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的图像处理相当陌生,想清除我的想法。如果我错了,那我怎样才能访问图像的每个像素值?

+0

cv :: Mat的值表示像素值。所以,你是对的。 – go4sri

回答

22

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

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

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

但是在1通道灰度图像的情况下是CV_8UC1而不是CV_32FC1

+4

应该是:'img.at (j,i)= 255; // white'(rows/cols wrong) – berak

+0

@Barshan Das您可以详细说明一下您的观点吗?但是如果是单通道灰度图像,则是CV_8UC1而不是CV_32FC1。这是什么意思? – user227666

+0

@berak:aahh特赦。感谢指点。编辑。 – Barshan

3

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

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