1、访问图像像素

1)灰度图像

2)彩色图像

OpenCV中的颜色顺序是BGR而不是RGB。

访问图像的像素在OpenCV中就是访问Mat矩阵,常用的有三种方法。

  • at定位符访问

Mat数据结构,操作灰度图像像素点:

int gray_value = (int) image.at<uchar>(i , j) ;

操作彩色图像像素点:

int color_value = (int) image.at<Vec3b>(i , j) [k];

  • 指针访问
for (int i = ; i < mat.rows; i++)
{
uchar* row = mat.ptr<uchar>(i); // 行指针
for (int j = ; j < mat.cols; j++) // 遍历每一行
{
row[j] = (uchar)((j / ) * );
}
}
  • 迭代器iterator访问
Mat_<Vec3b>::iterator it = M.begin<Vec3b>();//初始位置的迭代器
Mat_<Vec3b>::iterator itend = M.end<Vec3b>();//终止位置的迭代器
for (; it != itend; it++)
{
//处理BGR三个通道
(*it)[] = ;//B
(*it)[] = ;//G
(*it)[] = ;//R
}

2、图像亮度、对比度调节

图像亮度调节可以等效为图像的像素操作。如下面公式是一个线性的亮度调节。

g(x)=a*f(x) + b

其中:

g(x):处理后的图像

f(x):输入图像

a:增益(放大倍数),用来控制图像的对比度

b:偏置,用控制图像的亮度

Mat M = imread("D:/WORK/5.OpenCV/LeanOpenCV/pic_src/pic4.bmp", IMREAD_GRAYSCALE);
Mat M2 = Mat(M.rows, M.cols, CV_8UC1);
cout << M.channels() << endl;
cout << M.rows<<","<<M.cols << endl; float a = 0.5;
float b = ;
for (int i = ; i < M.rows; i++)
for (int j = ; j < M.cols; j++)
{
float pix = (float)M.at<uchar>(i, j);
pix = a * (float)pix + b;
if ((int)pix > ) pix = ;
M2.at<uchar>(i, j) = (uchar) pix;
} imshow("pic1", M);
imshow("pic2", M2);
waitKey();

3、获取图像ROI区域

图像的ROI(region of interest)是指图像中感兴趣区域、在OpenCV中图像设置图像ROI区域,实现对ROI区域操作。

方法1:

img(Rect(100, 100, 100, 100));

Rect代表一个矩形,Rect_ (_Tp _x, _Tp _y, _Tp _width, _Tp _height),参数分别是x,y,width,height。

方法2:

img(Range(100, 200), Range(100,200));

Range表示连续的行或列,Range (int _start, int _end);

示例:

Mat M = imread("D:/WORK/5.OpenCV/LeanOpenCV/pic_src/pic1.bmp");
cout << M.rows<<","<<M.cols << endl;
Mat roi = M(Rect(, , , )); imshow("pic1", M);
imshow("roi", roi);

4、图像混合

图像线性混合,产生类似画中画的效果。

h(x)=(1-a)*f(x) + b*g(x)

a的取值范围为0到1之间,通过对两幅图的像素加权得到最终的输出图像,两幅图像的大小和类型必须完全一致(两个矩阵相加维度必须一致)。

CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2,

double beta, double gamma, OutputArray dst, int dtype = -1);

例1:图片与背景图混合

Mat M = imread("D:/WORK/5.OpenCV/LeanOpenCV/pic_src/pic1.bmp");
cout << M.rows<<","<<M.cols << endl;
Mat y(M.rows, M.cols, CV_8UC3, Scalar(, , ));
Mat dst;
addWeighted(M, 0.3, y, 0.7, 0.0, dst); imshow("pic1", M);
imshow("y", y);
imshow("add", dst);

例2:两幅图像混合,先统一尺寸

Mat M = imread("D:/WORK/5.OpenCV/LeanOpenCV/pic_src/pic1.bmp");
Mat M2 = imread("D:/WORK/5.OpenCV/LeanOpenCV/pic_src/pic2.bmp");
M2 = M2(Rect(, , M.cols, M.rows)); //x,y,width,height
cout << M.rows<<","<<M.cols << endl;
cout << M2.rows << "," << M2.cols << endl;
Mat dst;
addWeighted(M, 0.7, M2, 0.3, 0.0, dst); imshow("pic1", M);
imshow("pic2", M2);
imshow("add", dst);

5、图像多通道分离

1)函数原型

/** @brief Divides a multi-channel array into several single-channel arrays.
@param src input multi-channel array.
@param mvbegin output array; the number of arrays must match src.channels(); the arrays themselves are reallocated, if needed.
*/
CV_EXPORTS void split(const Mat& src, Mat* mvbegin); /** @overload
@param m input multi-channel array.
@param mv output vector of arrays; the arrays themselves are reallocated, if needed.
*/

2)图像颜色通道

Mat M = imread("D:/WORK/5.OpenCV/LeanOpenCV/pic_src/pic5.bmp");
vector<Mat> channels;
split(M, channels); imshow("pic1", M);
imshow("B", channels.at());
imshow("G", channels.at());
imshow("R", channels.at());
/* 方法2
Mat channels[3];
split(M, channels); imshow("pic1", M);
imshow("B", channels[0]);
imshow("G", channels[1]);
imshow("R", channels[2]);

6、图像多通道合并

图像合并函数merge是split的逆操作,将多个数组合并成多通道的数组。

merge(const Mat * mv, size_t count, OutputArray       dst )

merge(InputArrayOfArrays mv, OutputArray dst )

//图像合并例子,方式1:
Mat M = imread("D:/WORK/5.OpenCV/LeanOpenCV/pic_src/pic5.bmp");
Mat channels[];
split(M, channels); imshow("pic1", M);
imshow("B", channels[]);
imshow("G", channels[]);
imshow("R", channels[]); Mat dst;
merge(channels, , dst);
imshow("merged", M);
//方式2:
Mat M = imread("D:/WORK/5.OpenCV/LeanOpenCV/pic_src/pic5.bmp");
vector<Mat> channels;
split(M, channels); imshow("pic1", M);
imshow("B", channels.at());
imshow("G", channels.at());
imshow("R", channels.at()); Mat dst;
merge(channels, dst);
imshow("merged", M);

输出如下图。

7、参考文献

1、《OpenCV3 编程入门》,电子工业出版社,毛星雨著

2、《学习OpenCV》,清华大学出版社,Gary Bradski, Adrian kaehler著

3、opencv常用api简单分析: split()、merge()

尊重原创技术文章,转载请注明。

https://www.cnblogs.com/pingwen/p/12296617.html

OpenCV3入门(四)图像的基础操作的更多相关文章

  1. MySQL入门(1)——基础操作

    MySQL入门(1)--基础操作 创建数据库 创建基本数据库: create database db_admin; 创建基本数据库(等价于CREATE DATABASE): create schema ...

  2. OpenCV3入门(二)Mat操作

    1.Mat结构 1.1.Mat数据 Mat本质上是由两个数据部分组成的类: 矩阵头:包含信息有矩阵的大小,用于存储的方法,矩阵存储的地址等 数据矩阵指针:指向包含了像素值的矩阵. 矩阵头部的大小是恒定 ...

  3. 第六十四天 JS基础操作

    一.分支结构 1.if语句 if基础语句 if(条件表达式){ 代码块: } // 当条件表达式结果为true,会执行代码块:反之不执行 // 条件表达式可以为普通表达式 // 0.undefined ...

  4. python_Opencv_图像的基础操作

    目标 获取像素值并修改 获取图像的属性(信息) 图像的ROI() 图像通道的拆分及合并 为图像扩充边缘 几乎所有以上的操作,与Numpy 的关系都比与OpenCV 的关系更加紧密,因此熟练Numpy ...

  5. opencv3 学习四 - 图像减色

    程序如下 #include "opencv2/opencv.hpp" using namespace cv; int main() { // 灰度图 Mat original = ...

  6. Swift语法基础入门四(构造函数, 懒加载)

    Swift语法基础入门四(构造函数, 懒加载) 存储属性 具备存储功能, 和OC中普通属性一样 // Swfit要求我们在创建对象时必须给所有的属性初始化 // 如果没办法保证在构造方法中初始化属性, ...

  7. Python文件基础操作(IO入门1)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6422270.html 本文出自:[Edwin博客园] Python文件基础操作(IO入门1) 1. pyth ...

  8. C#基础入门 四

    C#基础入门 四 方法参数 值参数:不附加任何修饰符: 输出参数:以out修饰符声明,可以返回一个或多个给调用者: 如果想要一个方法返回多个值,可以用输出参数来处理,输出参数由out关键字标识,如st ...

  9. 小白学 Python 数据分析(5):Pandas (四)基础操作(1)查看数据

    在家为国家做贡献太无聊,不如跟我一起学点 Python 人生苦短,我用 Python 前文传送门: 小白学 Python 数据分析(1):数据分析基础 小白学 Python 数据分析(2):Panda ...

随机推荐

  1. $loj6043$ [雅礼集训 $2017\ Day7$] 蛐蛐国的修墙方案 搜索

    正解:搜索 解题报告: 传送门$QwQ$ 首先由$p_i$是一个序列得,每个点的度数为2.且一定形成若干个环. 考虑先对每个环做,发现若要有解必须是偶环,且一定是隔一条边选一条边的,所以对每个环其实只 ...

  2. d3.js制作条形时间范围选择器

    此文章为原创文章,原文地址:https://www.cnblogs.com/eagle1098/p/12146688.html 效果如上图所示. 本项目使用主要d3.js v4制作,可以用来选择两年的 ...

  3. MacBook Pro 入手一年了,到底香不香?

    最近又有小伙伴问到底值不值得入手一台 MacBook Pro,松哥自己在 2018 年 10 月份的时候入手了一台,到现在为止,也用了一年多了,今天就来和小伙伴们聊一聊使用感受,至于到底值不值,需要大 ...

  4. 最全面的css布局

    1.定位 定位的概念就是它允许你定义一个元素相对于其他正常元素的位置,它应该出现在哪里,这里的其他元素可以是父元素,另一个元素甚至是浏览器窗口本身.还有就是浮动了,其实浮动并不完全算是定位,它的特性非 ...

  5. 大量SQL的解决方案——sdmap

    大量SQL的解决方案--sdmap 最近看到群里面经常讨论大型应用中SQL的管理办法,有人说用EF/EF Core,但很多人不信任它生成SQL的语句:有人说用Dapper,但将SQL写到代码中有些人觉 ...

  6. [ASP.NET Core 3框架揭秘] Options[2]: 配置选项的正确使用方式[下篇]

    四.直接初始化Options对象 前面演示的几个实例具有一个共同的特征,即都采用配置系统来提供绑定Options对象的原始数据,实际上,Options框架具有一个完全独立的模型,可以称为Options ...

  7. schedule of 2016-10-24~2016-10-30(Monday~Sunday)——1st semester of 2nd Grade

    2016/10/24 Monday forcus:find a way to try to recognize emotions in database2.0(see ppt Week 7) 1.pr ...

  8. TCP 协议详解

    TCP 协议是 更靠近应用层,因此在应用程序中具有更强可操作性,一些重要 socket 选项都和 TCP 协议相关. TCP 头部信息:TCP 头部信息出现在每个 TCP 报文段中,用于指定通信的源端 ...

  9. js对象转换为json格式时,js对象属性中有值为null和undefined注意事项

    当属性值为null时: 当属性值为undefined时: 只有当属性值为未定义时, js对象转换成json格式时会忽略该属性.

  10. js-xlsx 一个实用的js 导出列表插件

    在前端开发过程中,导出列表功能的开发无非两种,一种是有后台生成,发生给前端下载,第二种是前端进行列表的导出工作.之前接触了一种前端导出列表的插件 tableExport.js ,但是其缺点很明显,需要 ...