opencv獲取像素的值

 

opencv中獲取圖像像素的方法數組

方法一:指針

   IplImage *img = cvLoadImage("Lena.jpg", 0);內存

   CvScalar pixel;
 for (int i = 0; i < img->height; ++i)
 {
     for (int j = 0; j < img->width; ++j)
      {
         //得到像素的RGB值並顯示    opencv

          pixel = cvGet2D(img, i, j);
           printf("B=%f,G=%f,R=%f\t", pixel.val[0], pixel.val[1], pixel.val[2]);
         //修改各點的值
          pixel.val[0] = 0;   // B份量
          pixel.val[1] = 0;   // G份量
          pixel.val[2] = 0;   // R份量
         cvSet2D(img, i, j, pixel);
  }
 }float

注意內存中存儲順序是BGR方法

方法二:im

 for (int i = 0; i < img->height; ++i)
 {
        for (int j = 0; j < img->width; ++j)
     {數據

        int  b = CV_IMAGE_ELEM(paintx, uchar, y1, x1 * 3);img

        int  g = CV_IMAGE_ELEM(paintx, uchar, y1, x1 * 3+1);類型轉換

        int  r= CV_IMAGE_ELEM(paintx, uchar, y1, x1 * 3+2);
      }

}

方法三:

對於單通道字節型圖像:

 IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); 

 ((uchar *)(img->imageData + i*img->widthStep))[j]=111;

對於多通道字節型圖像:

IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); 

 ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B

 ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G

 ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R

對於多通道浮點型圖像:

 IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); 

 ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B

 ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G

 ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R

 

3 ((uchar*)(Img1->imageData + Img1->widthStep*pt.y))[pt.x]的具體含義:
 (1)這裏img1->imagedata指的圖像第一行的首地址,pt.y是指圖像的height(圖像高像素數即行數),y乘以img->widthstep(排列的圖像行大小)即首地址加上行數乘以每行總數,獲得第y行的首地址。widthstep是指圖像每行所佔的字節數,主要要和width區別,width是指每行所含的像素個數,可是一個像素也可能佔一個字節,也可能佔三個字節或者四個。imagedata是指向存儲圖像像素值數組的指針,內容是這個數組的首地址,pt.y指的是像素點的行座標,因此Img->imageData + Img->widthStep*pt.y即是該像素點所在行的首地址,而後再加上該像素點所在的列,即pt.x,就獲得了該像素點的地址,因此那句代碼也能夠寫成

((uchar*)(Img1->imageData + Img1->widthStep*pt.y+pt.x)),

都是指該像素點的像素值,至於強制類型轉換,是由於會產生一些負值,而像素值是不能爲負的。

(2)widthStep表示存儲一行像素須要的字節數。widthStep必須是4的倍數,若是8U圖像寬度爲3,那麼widthStep是4,加一個字節補齊。這個圖像的一行須要4個字節,只使用前3個,最後一個空在那兒不用。也就是一個寬3高3的圖像的imageData數據大小爲4*3=12字節。若是32F的圖像,那麼widthStep=width*4。

相關文章
相關標籤/搜索