图像的基本操作

OpenCV C++教程目录
1.在Windows Visual Studio中安装OpenCV C++版本
2.图像的基本操作
3.颜色空间转换
4.阈值分割
5.图像变换(缩放、裁剪、仿射变换)
6.图像滤波
7.Canny边缘检测
8.轮廓检测
9.透视变换(perspective transform)
10.光流

今天我们来学习一下在OpenCV中图像的一些基本操作。内容如下:

  • 加载、显示、保存图片
  • 用Mat来表示一张图片
  • Mat基本运算

1.加载、显示、保存图片

在OpenCV中,我们使用imread(), imshow(), imwrite()函数分别进行图像的读取,显示和保存。下面我们通过一个简单的例子来看一下如何使用这三个函数。示例的代码分别进行了如下操作

1.读取原始图片
2.显示原始图片
3.设置ROI(Region Of Interest)区域,即根据感兴趣的区域对图像进行裁剪
4.显示裁剪后的ROI区域
5.保存裁剪后的ROI区域

Mat img = imread("D:/projects/opencv/Lena.jpg"); //读取本地图片
imshow("Lena", img); //显示图片

Rect roi(10, 20, 100, 50); //设置ROI区域,4个参数分别对应裁剪区域的x, y坐标,以及裁剪的长方形的长和宽。
Mat img_roi = img(roi); //根据设置的区域进行裁剪

imshow("Lena", img); //显示裁剪后的ROI区域
waitKey(0);  //等待键盘输入后退出显示

imwrite("D:/projects/opencv/Lena_roi.jpg", img_roi); //保存裁剪后的ROI图片

2.用Mat来表示一张图片

数字图像在计算机中通常是以矩阵形式存储的。如下图所示,矩阵中的元素代表着图像信息。在OpenCV中,我们一般使用Mat这种数据结构来表示图像。Mat类分为头和指向图像数据的指针两部分。矩阵头主要包含:矩阵尺寸、存储方式、存储地址、引用计数等。


MatBasicImage.jpg

要注意的是Mat类利用了类似C++中智能指针的思想,Mat类对象在其引用计数为0时自动销毁,用户无需手动释放Mat对象。这使得OpenCV的内存管理变得简单。每个Mat对象拥有属于自己的头信息,但是图像数据信息则是可以是共享的。

Mat A, C; //声明A,C两个Mat类型变量,同时只创建了矩阵头
A = imread("test.jpg", IMREAD_COLOR); //将图片读取到A中
Mat B(A); //拷贝构造函数。只拷贝矩阵头,数据共享,同时A reference+1
C = A; //赋值构造函数。同样的,只有矩阵头信息从A拷贝到了C,数据是共享的, 同时A reference+1

当你需要拷贝数据信息,从而实现对图像进行不同的操作,而互不影响时,可以使用clone()copyTo()这两个函数。

Mat F = A.clone(); //拷贝A的头信息和数据信息到F
Mat G;
A.copyTo(G); //拷贝A的头信息和数据信息到F

3.Mat基本运算

1. Create() 方法

用于创建指定format的矩阵。

Mat img;
img.create (8, 8, CV_8UC3); //创建一个8行8列有3个通道的矩阵,数据类型为8bit unsigned char型:
2.矩阵初始化并赋值
Mat m = (Mat_(3,3) << 6,4,-2,2,1,0,2,3,-1);
3.创建特殊矩阵
cv::Mat o = cv::Mat::ones (3, 3, CV_8C); //3行3列的单位矩阵
cv::Mat e = cv::Mat::eye (3, 3, CV_8C); //3行3列的对角矩阵 
cv::Mat z = cv::Mat::zeros (3, 3, CV_8C); //3行3列的零矩阵
4.矩阵加减法
  • 相同大小的矩阵才能进行加减法。矩阵加减法两个矩阵对应位置的数值相加减,使用Mat类重载的 “+” 和 “-” 运算符
cv::Mat a = Mat::eye(Size(3,3), CV_8C);
cv::Mat b = Mat::ones(Size(3,3), CV_8C);
cv::Mat c= a + b;
cv::Mat d= a - b;
  • Mat对象也可以和常数相加, 同样使用”+"运算符, 果是矩阵中的每个元素都与这个数值相加
int C = 100;
Mat b = a + C;
4.矩阵乘法
  • 普通乘法。和线性代数中矩阵乘法类似,矩阵A和B相乘时,要求A的列数等于B的行数,才能进行运算。如A是MxN矩阵,B是NxL矩阵,它们的乘积AB是一个MxL矩阵。矩阵也可以和一个标量相乘,结果是矩阵的每一位和标量的乘积。
Mat a = Mat::ones(2,3,CV_32FC1);
Mat b = Mat::ones(3,2,CV_32FC1);
Mat m1 = a * b; //矩阵相乘
/********************************/
int C = 10;
Mat m2 = C * a; //矩阵与标量相乘
  • 点乘
    对两个矩阵执行点乘,就是对这两个矩阵对应位相乘之后再求和,因此点乘的结果是一个数值(标量)。
Mat a = Mat::ones(3,3,CV_8UC1);
Mat b = Mat::ones(3,3,CV_8UC1);
int dot = a.dot(b);
  • 对应位相乘
    要求相乘矩阵的行和列数相同,并且数据类型相同。如果保存结果的矩阵没有定义类型,则默认和相乘矩阵的类型相同。此时要注意可能发生的计算结果溢出问题。
Mat a = Mat::ones(3,3,CV_8UC1);
Mat a = Mat::ones(3,3,CV_8UC1);
Mat multiple = a.mul(b);
5.矩阵的转置
Mat a = Mat::eye(4, 6, CV_8C1);
Mat ta = a.t();
6.矩阵的逆
Mat a = Mat::eye(8, 8, CV_8C1);
Mat ia = a.inv();

以上就是OpenCV中Mat的常用运算。更多Mat运算可以参考OpenCV官方文档(基于4.5.2版本): OpenCV Mat Class reference

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容