OpenCv 如何对图像的像素进行操作(注意多通道图像在内存中的存储方式!!)
来源:互联网 发布:淘宝app怎么下载不了 编辑:程序博客网 时间:2024/06/16 10:04
对图像的像素进行操作,我们可以实现空间增强,反色等目的。让我们先来看一下内存空间中图像矩阵,也就是Mat的矩阵数值部分是怎么存储的:
如果图像是一幅灰度图像,他就像这样,从左到右,从上到下,依次是矩阵的每一行每一列,这时候矩阵M(i,j)的值自然就是当前点的灰度值了。
而对于一幅彩色图像,由于它的像素分量channel并不是一个,所以每一列又分为了几个channel。拿常见的RGB图像来说,就像这样:
从这张图上,就可以比较清楚地看出来在内存中矩阵是如何存储多channel图像的了。这里要注意的是在RGB模型中,每一个子列依次为BGR,也就是正好是颠倒的,第一个分量是蓝色,第二个是绿色,第三个是红色。
清楚了图像在内存中的存储方式,我们也就可以来进行像素值的操作了。在这里,我们举这样一个例子。我们对一幅灰度图像的灰度值进行变换:
小于100的灰度值被统一映射为0;100到200之间的灰度值被映射为100;大于200的灰度值被映射为200.
主函数如下:
首先,我们用指针方式对图像的像素点灰度值进行操作:
这里,我们获取了每一行开始处的指针,然后遍历至该行末尾。如果矩阵是以连续方式存储的,我们只需请求一次指针、然后一路遍历下去就行。彩色图像的情况有必要加以注意:因为三个通道的原因,我们需要遍历的元素数目也是3倍。
或者,我们可以使用data。data会从Mat中返回指向矩阵第一行第一列的指针。注意如果该指针为NULL则表明对象里面无输入,所以这是一种简单的检查图像是否被成功读入的方法。当矩阵是连续存储时,我们就可以通过遍历 data 来扫描整个图像。例如,一个灰度图像,其操作如下:
或者,更安全的方法,我们可以使用迭代器。在迭代法中,所需要做的仅仅是获得图像矩阵的begin和end,然后增加迭代直至从begin到end。将*操作符添加在迭代指针前,即可访问当前指向的内容。
注意,在这里对3通道的图像进行操作的时候,使用到了Vec3b。Vec3b作为一个对三元向量的数据结构,用在这里正好是能够表示RGB的三个分量。如果对于彩色图像,仍然用uchar的话,则只能获得3通道中的B分量。比如我们可以这样打印出图像的RGB三个分量:
这里使用指针,当然也可以使用上面的迭代器。
然而,OpenCV里面已经有了相应函数可以让我们更加方便地对像素进行操作,那便是LUT函数,而且推荐使用opencv的内建函数,因为已经针对芯片做了优化设计,使得速度有很大提升。
函数原型为:void LUT(InputArray src, InputArray lut, OutputArray dst, int interpolation=0 )
实现的映射关系如下所示:
也就是说比如原来src中值为1会映射为table[1]所对应的值再加上d。
所以上面的操作,我们其实只需要使用LUT函数就可以了。结合我们自己设计的table表,就能够实现对图像的操作。
下面的图就是效果啦~~~
- OpenCv 如何对图像的像素进行操作(注意多通道图像在内存中的存储方式!!)
- OpenCV(二)如何对图像的像素进行操作
- OpenCv 如何对图像的像素进行操作
- opencv对图像像素进行操作
- 快速对图像的像素进行操作 opencv 实战
- (转载)快速对图像的像素进行操作 opencv 实战
- 快速对图像的像素进行操作 opencv 实战
- opencv学习之快速对图像的像素进行操作 opencv 实战
- 在内存对图片进行操作的时候注意小数的问题
- OpenCV对图像进行mask操作
- OpenCV 对图像进行掩码操作
- 对图像的单个像素操作
- cuda中对图像像素的操作
- 【OpenGL】对像素图像的一些操作
- OpenCV:访问图像中的像素
- opencv 使用Mat 矩阵进行图像的降采样,像素的访问方式
- opencv之Rgb图像转化到HSV、Lab空间,对各通道的操作
- opencv & qt study-(5)-操作图像中的像素
- 【技能库】--jvm crash 如何开启 core dump 如何分析(280)
- 排序方法之冒泡(鸡尾酒)、选择、插入(二分插入)、希尔排序
- 扩展gcd
- 时间
- PIC单片机中断服务程序
- OpenCv 如何对图像的像素进行操作(注意多通道图像在内存中的存储方式!!)
- Linux网络编程之socket函数
- 数组
- 笔记15--js基础知识--字符串
- final关键字
- SG定理与SG函数(模板)
- Ceph与Swift简易对比
- C++:重载、覆盖与隐藏
- 【PAT】【Advanced Level】1041. Be Unique (20)