1、图像在内存中存储方式,图像矩阵的大小取决于颜色模型,取决于所有的通道数;还有重要的颜色空间缩减的概念:因为如果是RGB的话,使用uchar的话,就有256^3的结合方法。所以要用到颜色缩减的方法,就是利用在每个像素值里抽选一部分像素值,而不是选择全部像素值。利用的公式是Inew=(Iold/10)*10来计算。

总结来看:就是对图像矩阵遍历每一个像素,然后对像素值进行公式运算。

2、LUT函数:Look up table操作,就是对于像素图像进行批量查找、扫描与操作图像。计时函数:getTickCount()和getTickFrequency()函数。

3、访问图像中像素的三类方法,参照opencv蓝皮书的111页,(colorReduce()函数的三种写法:(这个是用来减少颜色空间的函数)

//这种做法是第一种做法用指针来做。
void colorReauce(Mat& inputImage, Mat& outputImage, int div)
{
outputImage = inputImage.clone();//这个是将图片复制;
int rowNumber = outputImage.rows;//
int colNumber = outputImage.cols*outputImage.channels();这个是找出每列中元素的个数,找出通道中的个数,参照那个图片颜色空间的通道数目。灰度图是通道数为1,彩色图是通道数为3;
for (int i = ; i < rowNumber; i++)
{
uchar* data = outputImage.ptr<uchar>(i);//获取第i行的首地址;
for (int j = ; j < colNumber; j++)
{
data[j] = data[j] / div*div + div / ;//处理每个像素 ;
}
}
}

第一种是用指针的方法访问元素;

第二种做法是用迭代器来处理像素;类似与STL库中的迭代器;

第三种做法是用动态地址来计算,就是将蓝色、红色和绿色来进行分别测量;(image.at<vec3b>(j, i)[channe]=value;tips:注意这个通道的顺序是BGR,不是RGB)

4、ROI区域图像叠加&图像混合

感兴趣区域:ROI(这个是简化工作工程的图片区域,是从图像中选择一个图像区域中)

定义这个区域有两种方法:(1)使用矩形区域Rect(2)指定感兴趣行或列的范围(Range)Range是指从起始索引到终止索引,

(1)Mat imageROI;

Mat imageROI = image(Rect(500,250,logo.cols,logo.rows));//这个是定义ROI区域的

(2)imageROI = image(Range(250,250+logoImage.rows),Range(200,200+logoIamge.cols));

5、addWeighted()函数 (计算数组加权和)double alpha、double beta和 double gamma这个分别代表数组的权重。参照ROI蓝皮书的118页的代码;

(tips:两幅图片一定要同样的类型和尺寸,因为我们做的是两张图片的加权,两张图片不相同不能运算)

6、初级图像混合:addWeighted函数,参照前面的代码(https://blog.csdn.net/poem_qianmo/article/details/20911629

addWeighted的矩阵表达式是:dst = src1[I]*alpha+ src2[I]*beta + gamma;

7、分离颜色通道、多通道图像混合;通过split和merge方法来进行。

(1)通道分离:split()函数,是一个多通道数组分离几个单通道数组;

split函数:void split(const Mat& src, Mat *mvbegin);

void split(InputArray m, OutputArrayOfArrays mv);

公式:mv[c](I)=src(I)c

8、输入XML和YAML文件

xml和YAML文件是用来做数据的存储和传输用的,我们训练玩的特征点数据是存储在这里的。

9、阈值化

固定阈值操作:Threshold函数

函数Threshold()对单通道数组应用固定阈值操作,典型对于灰度图像进行阈值操作得到二值图像,compare()函数可以达到目的;

double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)

  • 第一个参数,InputArray类型的src,输入数组,填单通道,8或32位浮点类型Mat即可
  • 第二个参数,OutputArray类型的dst,函数调用后的运算结果存在这里,这个参数用来存放输出结果,且和第一个参数中的Mat变量有一样尺寸和类型;
  • 第三个参数,double类型的thresh,阈值的具体值。
  • 第四个参数,double类型的maxval,当第五个参数阈值类型type取CV_THRESH_BINARY 或者 CV_THRESE_INV时阈值类型最大值;
  • 第五个参数,int类型的type,阈值类型。threshold()函数支持的对图像取阈值的方法由其确定

自适应阈值操作:adaptiveThreshold()函数;

void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholType, int blockSize, double c)

  • 第一个参数,InputArray类型的src,输入图像;

第二个参数,OutputArray类型的dst,这个类型和尺寸和源图像相同;

10、RotatedRect()函数

RotatedRect该类表示平面上的旋转矩形,有三个属性:

  1. 矩形中心点(质心)
  2. 边长(长和宽)

3.旋转角度

opencv core组件进阶的更多相关文章

  1. opencv 3 core组件进阶(3 离散傅里叶变换;输入输出XML和YAML文件)

    离散傅里叶变换 #include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" ...

  2. opencv 3 core组件进阶(2 ROI区域图像叠加&图像混合;分离颜色通道、多通道图像混合;图像对比度,亮度值调整)

    ROI区域图像叠加&图像混合 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp&g ...

  3. opencv 3 core组件进阶(1 访问图像中的像素)

    访问图像像素的三类方法 ·方法一 指针访问:C操作符[ ]; ·方法二 迭代器iterator; ·方法三 动态地址计算. #include <opencv2/core/core.hpp> ...

  4. OpenCV之Core组件进阶

    颜色空间缩减 利用C++类型转换时向下取整操作,实现定义域内颜色缩减.表达式如下 Inew = (Iold/10)*10 简单的颜色空间缩减算法可由以下两步组成: (1)遍历图像矩阵的每个元素 (2) ...

  5. core组件进阶

    访问图像像素 存储方式 BGR连续存储有助于提升图像扫描速度. isContinuous()判断是否是连续存储. 颜色空间缩减 仅用这些颜色中具有代表性的很小的部分,就足以达到同样的效果. 将现有颜色 ...

  6. OpenCV4Android——No implementation found for native Lorg/opencv/core/Mat;.n_Mat ()J

    ok 12-17 08:13:10.461: W/dalvikvm(540): No implementation found for native Lorg/opencv/core/Mat;.n_M ...

  7. java.lang.UnsatisfiedLinkError: No implementation found for long org.opencv.core.Mat.n_Mat()

    Android调试openCV4Android的时候出现以下错误 java.lang.UnsatisfiedLinkError: No implementation found for long or ...

  8. .Net Core组件化视图(部分视图)

    .Net Core组件化视图(部分视图) 1.背景 1.以前我们使用.Net的时候使用部分视图的方式在,.Net Core 中能在单独处理逻辑的部分视图没有了,但是我们还是想使用现在的.Net Cor ...

  9. Vue基础二之全局API、实例属性和全局配置,以及组件进阶(mixins)的详细教程(案列实现,详细图解,附源码)

    本篇文章主要是写Vue.directive().Vue.use()等常用全局API的使用,vm.$props.vm.$options.vm.$slots等实例属性的使用,以及Vue全局配置.组件的mi ...

随机推荐

  1. 网络基础之IP地址和子网掩码

    IP地址 IP是英文Internet Protocol的缩写,意思是"网络之间互连的协议",也就是为计算机网络相互连接进行通信而设计的协议.在因特网中,它是能使连接到网上的所有计算 ...

  2. MSSQL · 最佳实践 · 利用文件组实现冷热数据隔离备份方案

    文件组的基本知识点介绍完毕后,根据场景引入中的内容,我们将利用SQL Server文件组技术来实现冷热数据隔离备份的方案设计介绍如下. 设计分析 由于payment数据库过大,超过10TB,单次全量备 ...

  3. 内网arp攻击

    内网arp攻击 环境:一台kali虚拟机(攻击者),一台win7虚拟机(用户) 网络:NAT模式 网段:192.168.41.0/24 网关:192.168.41.2/24 win7的IP地址:192 ...

  4. Javaweb学习(二):Http通信协议

      当我们开始jsp/servlet编程之旅之前,我们还需要知道一些关于网络通讯方面的一些知识.这样能更加有助于我们的理解,希望大家能看懂我的描述,而不至于在学习的路上一知半解.(手动比❤) 认识Ht ...

  5. 页面元素固定在页面底部的纯css代码(兼容IE6)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. HTML5音/视频标签详解

    一.发展历: 早期:<embed>+<object>+文件   问题:不是所有浏览器都支持,而且embed不是标准.   现状:Realplay.window media.Qu ...

  7. 为什么Github要把代码合并请求称为pull request而不是push request?

    问题: 我的理解是:我做了一些修改,我请求把我的修改push到你的仓库,然后你review一下我的代码,如果没问题就接受请求merge,这样的话叫做push request岂不是更合适?因为这个操作是 ...

  8. Linux chmod +755和chmod +777 各是什么意思呢?

    你可以在linux终端先输入ls -al,可以看到如: -rwx-r--r-- (一共10个参数)第一个跟参数跟chmod无关,先不管.2-4参数:属于user5-7参数:属于group8-10参数: ...

  9. RFS实例登录126邮箱/利用cookie登陆百度

    可以直接添加用户关键字,也可以新建资源,将用户关键字添加入资源,然后导入整个资源文件 用户关键字内部实现如下: 打开126邮箱首页: Open Browser  Http://mail.126.com ...

  10. Oracle 11g常用管理命令(用户、表空间、权限)

    PS:下面是Oracle 11g最常用的基本管理命令,包括创建用户.表空间,权限分配等.以下命令本人都验证操作过,并加上了本人的小结与说明. 1.启动oracle数据库: 从root切换到oracle ...