画像ピクセルへのアクセス方法


(座標は0から始まり、画像原点に対する位置.画像原点または左上隅(img->origin=IPL_ORIGIN_TL)または左下隅(img->origin=IPL_ORIGIN_BL))
  • 偽8-bit 1-チャンネルの画像I(IplImage*img):
  • I(x,y) ~ ((uchar*)(img->imageData + img->widthStep*y))[x]
    
  • 偽8-bit 3-チャンネルの画像I(IplImage*img):
  • I(x,y)blue ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3]
    I(x,y)green ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3+1]
    I(x,y)red ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3+2]
    

    例えば、点(100100)の輝度を30増加させると、以下のようにすることができる.
    CvPoint pt = {100,100};
    ((uchar*)(img->imageData + img->widthStep*pt.y))[pt.x*3] += 30;
    ((uchar*)(img->imageData + img->widthStep*pt.y))[pt.x*3+1] += 30;
    ((uchar*)(img->imageData + img->widthStep*pt.y))[pt.x*3+2] += 30;
    

    またはより効率的に:
    CvPoint pt = {100,100};
    uchar* temp_ptr = &((uchar*)(img->imageData + img->widthStep*pt.y))[pt.x*3];
    temp_ptr[0] += 30;
    temp_ptr[1] += 30;
    temp_ptr[2] += 30;
    
  • ダミー32-bit浮動小数点数、1-チャネル画像I(IplImage*img):
  • I(x,y) ~ ((float*)(img->imageData + img->widthStep*y))[x]
    
  • 現在、一般的な場合、N-チャネルがあると仮定し、タイプTの画像:
  • I(x,y)c ~ ((T*)(img->imageData + img->widthStep*y))[x*N + c]
    

    マクロCV_を使用できますIMAGE_ELEM( image_header, elemtype, y, x_Nc )
    I(x,y)c ~ CV_IMAGE_ELEM( img, T, y, x*N + c )
    

    共有先: