初出茅廬之OpenCV,圖像數據cv::Mat.at和cv::MaT.ptr對單個像素的訪問和操作

在學習OpenCV進行圖像處理的過程中,常常會用到對指定位置像素的讀取和修改,

最常用的就是cv::MAT.at<>()和cv::MAT.ptr<>(),下面我們就介紹OpenCV中這兩種常用的對指定位置像素值的讀取和修改操作。

一、at操作

at操作是一種直接簡單的對單個像素的操作方式,用於獲取圖像矩陣某點的值或改變某點的值

對於灰度圖讀取和修改操作如下:
          uchar srcPixel_value = cv::Mat.at<uchar>(row, col);
          cv::Mat.at<uchar>(row, col) = srcPixel_value ; 


對於RGB彩色圖像而言:

          cv::Vec3b rgb_value = cv::Mat.at<cv::Vec3b>(row, col);
          cv::Mat.at<cv::Vec3b>(row, col) = rgb_value ;

或者:

           image.at<cv::Vec3b>(row, col)[0] =  255;

           image.at<cv::Vec3b>(row, col)[1] =  255;

           image.at<cv::Vec3b>(row, col)[2] = 255;

例子:

  cv::Mat  image(3,10,CV_32FC3);
  int div = 4;
     for(int i=0; i<image.rows;i++)
     {
        for(int j=0; j<image.cols; j++)
        {
          image.at<Vec3f>(i,j)[0]=image.at<Vec3f>(i.j)[0] / div;
          image.at<Vec3f>(i,j)[1]=image.at<Vec3f>(i.j)[1] / div;
          image.at<Vec3f>(i,j)[2]=image.at<Vec3f>(i.j)[2] / div;
        }
     };

at操作雖然簡單方便,但是這種操作是一種效率比較低的操作,尤其用其進行遍歷操作時,效率會很低。因此一般不推薦使用。

 

二、ptr操作:

ptr操作時通過指針偏移的方式進行像素的查找、遍歷和修改的,因此效率相對較高。

ptr<>()是按照行來訪問數組的,指針指向某一行第一個元素的首地址。只要知道這一行的首地址,其餘地址++就可以訪問了。
對於灰度圖的讀取和修改操作如下:

uchar srcPixel_value = cv::Mat.ptr<uchar>(row)[col];
cv::Mat.ptr<uchar>(row)[col] = srcPixel_value ; 

對於RGB彩色圖像而言:

cv::Vec3b rgb_value = Mat.ptr<cv::Vec3b>(row)[col];
cv::Mat.ptr<cv::Vec3b>(row)[col] = rgb_value ;

例子:

cv::Mat image (3,10,float);
int div = 4;
cv::Mat newimage(image.size(), image.type());
for(int i=0; i<image.rows; i++)
  {
      uchar *data=image.ptr<uchar>(i);
      uchar *outdata=newimage.ptr<uchar>(i);
     for(int j=0; j<image.cols; j++)
     {
       outdata[ j ]= data[ j ] /div;
     }
  };

cv::MAT.ptr<>()訪問效率比較高,程序也比較安全,有越界判斷。推薦使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章