掃描圖像的像素

在 opencv 中獲取圖像的像素有三種方式:安全

先加載圖像:spa

Mat image=imread(image_path);

 

1、最高效的方式指針

這種方式只須要一個指針即可訪問圖像的全部像素,用法以下:code

 1 int i=0,j=0;
 2 //單通道;
 3 uchar *p;
 4 for( i = 0; i < image.rows; ++i)
 5 {
//獲取該行的首指針;
6 p = image.ptr<uchar>(i); 7 for ( j = 0; j < image.cols; ++j) 8 { 9 p[j]=..........//訪問圖像像素; 10 } 11 } 12 //3通道; 13 Vec3b *p; 14 for( i = 0; i < image.rows; ++i) 15 { 16 p = image.ptr<Vec3b>(i); 17 for ( j = 0; j < image.cols; ++j) 18 { 19 p[j][0]=..........//訪問圖像像素 G份量; 20 p[j][1]=..........//訪問圖像像素 B份量; 21 p[j][2]=..........//訪問圖像像素 R份量; 22 } 23 }

這是掃描像素速度最快的方法。對象

這個方法還有另外一個版本,Mat 對象有一個成員變量 data ,data 是一個指針,它指向圖像數據第一行第一列,咱們能夠用它來訪問全部的圖像數據。blog

若是 data 的值爲 null ,則代表圖像加載失敗,所以,能夠用該變量來檢測圖像是否加載成功。索引

uchar* p = image.data;
for( unsigned int i =0; i < image.cols*image.rows; ++i)
*p++ =........;

2、最安全的方法it

上一種方法須要本身控制索引的範圍,這種方法則不須要。opencv

const int channels = image.channels();
switch(channels)
{
  case 1:
          {
              MatIterator_<uchar> it, end;
              for( it = image.begin<uchar>(), end = image.end<uchar>(); it !=end; ++it)
              *it =....;
              break;
}
case 3: { MatIterator_<Vec3b> it, end; for( it = image.begin<Vec3b>(), end = image.end<Vec3b>(); it != end; ++it) { (*it)[0] = .....; (*it)[1] = .....; (*it)[2] = .....; } } }

 

3、直接索引(最慢)class

const int channels = image.channels();
switch(channels)
{
   case 1:
        {
           for( int i = 0; i < image.rows; ++i)
           for( int j = 0; j < image.cols; ++j )
           image.at<uchar>(i,j) = ......;           break;
        }
   case 3:
        {
for( int i = 0; i < image.rows; ++i) for( int j = 0; j < image.cols; ++j ) { image.at<Vec3b>(i,j)[0] = ......; image.at<Vec3b>(i,j)[1] = ......; image.at<Vec3b>(i,j)[2] = ......; }
break; } }
相關文章
相關標籤/搜索