opencv学习笔记2--存取图像元素
最近了解了下如何存取图像元素,在这里归纳总结下,也是记录下,以后需要的时候可以复习下。
假设需要读取在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--存取图像元素相关推荐
- opencv学习笔记12:图像腐蚀和图像膨胀
语言:python+opencv 为什么使用图像腐蚀和图像膨胀 如图,使用图像腐蚀进行去噪,但是为压缩噪声. 对腐蚀过的图像,进行膨胀处理,可以去除噪声,并保持原样形状. 图像腐蚀 腐蚀主要针对的是二 ...
- opencv学习笔记20:图像轮廓
图像轮廓 Contours:轮廓 轮廓是将没有连着一起的边缘连着一起. 边缘检测检测出边缘,边缘有些未连接在一起. 注意问题 1.对象为二值图像,首先进行阈值分割或者边缘检测. 2.查找轮廓需要更改原 ...
- opencv学习笔记19:图像金字塔和图像拉普拉斯金字塔 (用于图像放大和缩小)
图像金字塔原理 图像金字塔:只不同分辨率,不同尺寸子图构成的集合. 取样 向下取样:有一个图像G0,对它重新采样,得到分辨率小些的G1,以此类推. 向上取样:有一个图像G3,然后变成像素更多的G2,以 ...
- opencv学习笔记14:图像礼帽,图像黑帽
python + OpenCV 图像礼帽 图像礼帽 也叫图像顶帽 礼帽图像=原始图像-开运算图像 得到噪声图像 开运算:先腐蚀再膨胀 使用对象:二值图像 使用方法:morphologyEx cv2.M ...
- opencv学习笔记11:图像滤波(均值,方框,高斯,中值)
为什么要使用滤波 消除图像中的噪声成分叫作图像的平滑化或滤波操作.信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感兴趣的信息经常被噪声淹没.因此一个能降低高频成分幅度的滤波 ...
- opencv 学习笔记9:图像缩放与图像翻转
图像缩放 缩放包括缩小和放大 语法格式 cv2.resize()有很多参数,其中src和dsize必备 cv2.resize(src.dsize) src原始图像路径 dsize 目标图像大小 (列, ...
- opencv学习笔记7:图像加法与图像融合
图像加法 1.使用Numpy加法 运算方式:结果=图像1+图像2 原理:图像数据格式为unit8 8位二进制表示范围是0到255. 二进制相加 1.不超过255的,如100+58=158 2.两数相加 ...
- [转载] opencv学习笔记7:图像加法与图像融合
参考链接: python opencv 基础 4: addWeighted() 融合两张图像 图像加法 1.使用Numpy加法 运算方式:结果=图像1+图像2 原理:图像数据格式为unit8 8位二进 ...
- opencv 手选roi区域_【opencv学习笔记六】图像的ROI区域选择与复制
图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...
最新文章
- wmp流代理服务器设置为空,wmp服务器运行失败
- vscode拼写错误提醒消失
- Object类中有哪些方法
- PIX515防火墙配置策略实例
- spring的事务有几种方式
- 神经网络中的反向传播算法
- oc快速生成单例头文件解析
- 项目实战:如何构建知识图谱
- 简单猜年龄游戏Python代码
- canvas画任意角度的扇形,弧形,及扇形弧形填纯色渐变色
- 2022-2028年中国医疗信息化行业深度调研及投资前景预测报告
- 前端系列 | 2015年双11手淘前端技术巡演 - 前言
- 优测云服务平台告诉你软件测试的工作内容主要有哪些?
- 移动互联时代,这家公司竟这样改变了我们的世界
- operate函数C语言,operate是什么意思 operate radical chan
- 中国聚合支付市场深度调研及投资前景预测报告2022-2028年
- 在云服务器上搭建Aria网盘服务以及离线下载
- 360推广如何提高权重
- 传输指令ssh,sftp,scp
- 企业微信文件分享到微信的坑
热门文章
- vscode 默认初始化_Visual Studio Code(vscode)使用介绍
- Linux c 算法与数据结构--双向链表
- 得到classpath和当前类的绝对路径的一些方法
- Python使用select实现异步通信
- python多线程编程(7):线程间通信
- windows平台编译vlc
- VC6 + OpenCV1.0实现图片缩放显示
- [react] 在React中怎么引用sass或less?
- 重学java基础第二十三课:java基础 注释
- react学习(61)--js contact