最近了解了下如何存取图像元素,在这里归纳总结下,也是记录下,以后需要的时候可以复习下。

假设需要读取在i行j列像点的第k通道. 其中, 行数i的范围为[0, height-1], 列数j的范围为[0, width-1], 通道k的范围为[0, nchannels-1].

1.间接存取: (比较通用, 但效率低, 可读取任一类型图像数据)

对单通道字节图像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
CvScalar s;
s=cvGet2D(img,i,j); // get the (i,j) pixel value
printf("intensity=%f\n",s.val[0]);
s.val[0]=111;
cvSet2D(img,i,j,s); // set the (i,j) pixel value

对多通道浮点或字节图像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
CvScalar s;
s=cvGet2D(img,i,j); // get the (i,j) pixel value
printf("B=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]);
s.val[0]=111;
s.val[1]=111;
s.val[2]=111;
cvSet2D(img,i,j,s); // set the (i,j) pixel value

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.用指针直接存取 : (在某些情况下简单高效)

对单通道字节图像:

IplImage* img      =cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
int height        = img->height;
int width         = img->width;
int step           = img->widthStep/sizeof(uchar);
uchar* data        =(uchar *)img->imageData;
data[i*step+j] = 111;

对多通道字节图像:

IplImage* img      =cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
int height        = img->height;
int width         = img->width;
int step           = img->widthStep/sizeof(uchar);
int channels       =img->nChannels;
uchar* data        =(uchar *)img->imageData;
data[i*step+j*channels+k] = 111;

对单通道浮点图像(假设用4字节调整):

IplImage* img      =cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
int height        = img->height;
int width         = img->width;
int step           = img->widthStep/sizeof(float);
int channels       =img->nChannels;
float * data        =(float *)img->imageData;
data[i*step+j*channels+k] = 111;

4.使用 c++ wrapper 进行直接存取: (简单高效)

对单/多通道字节图像,多通道浮点图像定义一个 c++ wrapper:

template<class T> classImage
{private:IplImage* imgp;public:Image(IplImage* img=0){imgp=img;}~Image(){imgp=0;}void operator=(IplImage*img) {imgp=img;}inline T*operator[](const int rowIndx) {return ((T*)(imgp->imageData + rowIndx*imgp->widthStep));}
};
typedef struct{unsigned char b,g,r;
} RgbPixel;
typedef struct{float b,g,r;
} RgbPixelFloat;
typedef Image<RgbPixel>           RgbImage;
typedef Image<RgbPixelFloat>      RgbImageFloat;
typedef Image<unsigned char>      BwImage;
typedefImage<float>              BwImageFloat;

单通道字节图像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
BwImage imgA(img);
imgA[i][j] = 111;

多通道字节图像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
RgbImage      imgA(img);
imgA[i][j].b = 111;
imgA[i][j].g = 111;
imgA[i][j].r = 111;

多通道浮点图像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
RgbImageFloat imgA(img);
imgA[i][j].b = 111;
imgA[i][j].g = 111;
imgA[i][j].r = 111;

opencv学习笔记2--存取图像元素相关推荐

  1. opencv学习笔记12:图像腐蚀和图像膨胀

    语言:python+opencv 为什么使用图像腐蚀和图像膨胀 如图,使用图像腐蚀进行去噪,但是为压缩噪声. 对腐蚀过的图像,进行膨胀处理,可以去除噪声,并保持原样形状. 图像腐蚀 腐蚀主要针对的是二 ...

  2. opencv学习笔记20:图像轮廓

    图像轮廓 Contours:轮廓 轮廓是将没有连着一起的边缘连着一起. 边缘检测检测出边缘,边缘有些未连接在一起. 注意问题 1.对象为二值图像,首先进行阈值分割或者边缘检测. 2.查找轮廓需要更改原 ...

  3. opencv学习笔记19:图像金字塔和图像拉普拉斯金字塔 (用于图像放大和缩小)

    图像金字塔原理 图像金字塔:只不同分辨率,不同尺寸子图构成的集合. 取样 向下取样:有一个图像G0,对它重新采样,得到分辨率小些的G1,以此类推. 向上取样:有一个图像G3,然后变成像素更多的G2,以 ...

  4. opencv学习笔记14:图像礼帽,图像黑帽

    python + OpenCV 图像礼帽 图像礼帽 也叫图像顶帽 礼帽图像=原始图像-开运算图像 得到噪声图像 开运算:先腐蚀再膨胀 使用对象:二值图像 使用方法:morphologyEx cv2.M ...

  5. opencv学习笔记11:图像滤波(均值,方框,高斯,中值)

    为什么要使用滤波 消除图像中的噪声成分叫作图像的平滑化或滤波操作.信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没.因此一个能降低高频成分幅度的滤波 ...

  6. opencv 学习笔记9:图像缩放与图像翻转

    图像缩放 缩放包括缩小和放大 语法格式 cv2.resize()有很多参数,其中src和dsize必备 cv2.resize(src.dsize) src原始图像路径 dsize 目标图像大小 (列, ...

  7. opencv学习笔记7:图像加法与图像融合

    图像加法 1.使用Numpy加法 运算方式:结果=图像1+图像2 原理:图像数据格式为unit8 8位二进制表示范围是0到255. 二进制相加 1.不超过255的,如100+58=158 2.两数相加 ...

  8. [转载] opencv学习笔记7:图像加法与图像融合

    参考链接: python opencv 基础 4: addWeighted() 融合两张图像 图像加法 1.使用Numpy加法 运算方式:结果=图像1+图像2 原理:图像数据格式为unit8 8位二进 ...

  9. opencv 手选roi区域_【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

最新文章

  1. wmp流代理服务器设置为空,wmp服务器运行失败
  2. vscode拼写错误提醒消失
  3. Object类中有哪些方法
  4. PIX515防火墙配置策略实例
  5. spring的事务有几种方式
  6. 神经网络中的反向传播算法
  7. oc快速生成单例头文件解析
  8. 项目实战:如何构建知识图谱
  9. 简单猜年龄游戏Python代码
  10. canvas画任意角度的扇形,弧形,及扇形弧形填纯色渐变色
  11. 2022-2028年中国医疗信息化行业深度调研及投资前景预测报告
  12. 前端系列 | 2015年双11手淘前端技术巡演 - 前言
  13. 优测云服务平台告诉你软件测试的工作内容主要有哪些?
  14. 移动互联时代,这家公司竟这样改变了我们的世界
  15. operate函数C语言,operate是什么意思 operate radical chan
  16. 中国聚合支付市场深度调研及投资前景预测报告2022-2028年
  17. 在云服务器上搭建Aria网盘服务以及离线下载
  18. 360推广如何提高权重
  19. 传输指令ssh,sftp,scp
  20. 企业微信文件分享到微信的坑

热门文章

  1. vscode 默认初始化_Visual Studio Code(vscode)使用介绍
  2. Linux c 算法与数据结构--双向链表
  3. 得到classpath和当前类的绝对路径的一些方法
  4. Python使用select实现异步通信
  5. python多线程编程(7):线程间通信
  6. windows平台编译vlc
  7. VC6 + OpenCV1.0实现图片缩放显示
  8. [react] 在React中怎么引用sass或less?
  9. 重学java基础第二十三课:java基础 注释
  10. react学习(61)--js contact