怎么访问图像像素

(坐标是从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]
例如,给点 (100,100) 的亮度增加 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 )

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通过 GetImagePointer1 获取的图像指针,可以访问图像像素。在使用指针访问像素时,需要注意图像的数据类型和通道数,以便正确地访问像素数据。 以获取灰度图像指针为例,假设获取的指针为 `unsigned char* ptr`,图像大小为 `width x height`,则可以通过以下方式访问像素: ```c++ // 访问第 i 行第 j 列像素 unsigned char pixel = *(ptr + i * width + j); ``` 对于彩色图像,如果是 RGB 彩色图像,每个像素有 3 个通道,可以使用以下方式访问像素: ```c++ // 访问第 i 行第 j 列像素的 R 通道 unsigned char r = *(ptr + (i * width + j) * 3); // 访问第 i 行第 j 列像素的 G 通道 unsigned char g = *(ptr + (i * width + j) * 3 + 1); // 访问第 i 行第 j 列像素的 B 通道 unsigned char b = *(ptr + (i * width + j) * 3 + 2); ``` 如果是 RGBA 彩色图像,每个像素有 4 个通道,可以使用以下方式访问像素: ```c++ // 访问第 i 行第 j 列像素的 R 通道 unsigned char r = *(ptr + (i * width + j) * 4); // 访问第 i 行第 j 列像素的 G 通道 unsigned char g = *(ptr + (i * width + j) * 4 + 1); // 访问第 i 行第 j 列像素的 B 通道 unsigned char b = *(ptr + (i * width + j) * 4 + 2); // 访问第 i 行第 j 列像素的 A 通道 unsigned char a = *(ptr + (i * width + j) * 4 + 3); ``` 需要注意的是,以上访问像素的方式仅适用于图像数据是连续存储的情况,如果图像数据不是连续存储,需要使用其他的访问方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值