初学opencv c++学习笔记图像的相关操作及属性

Posted 努力码代码的菜鸟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初学opencv c++学习笔记图像的相关操作及属性相关的知识,希望对你有一定的参考价值。

内容涉及到图像读取的at()操作,图像的拆分和合并的参数解释和代码,以及一些常用的图像属性的内置函数。


提示:以下是本篇文章正文内容,下面案例可供参考

一、图像的读写操作at()函数

apI:at()


单通道图像:img.at<uchar>(i,j)            

    表示在第i行,第j列的像素值

多通道图像:img.at<Vec3b>(i,j)[c]       

    表示在某个通道中第i行,第j列的像素值

  • <>中为图像元素的类型。uchar为无符号字符型,Vec3b等于vector<uchar,3>,表示一个uchar类型的数组,长度为3。
  • (i,j)指像素点的位置。
  • [c]表示通道。RGB图像,由于opencv中按照BGR顺序,所以[0],[1],[2]分别表示B,G,R通道。


  

二、图像通道的拆分与合并

apl:split()


1.通道拆分

官方定义:

void split(InputArray m, OutputArrayOfArrays mv);

 参数解释:

(1) :    输入的多通道图像,对该图像进行通道的拆分。

(2) mv :    存放图像拆分后的三个通道的灰度图像的容器。mv为图像数组,使用vector容器。

代码演示:

#include <opencv2/imgcodecs.hpp>       //imread
#include <opencv2/highgui.hpp>         //imshow  waitKey
 
using namespace std;
using namespace cv;

int main()

    vector<Mat> channels;//声明vector,作为分离后三个通道的图像的保存容器
    Mat img = imread("C:/r/bear.jpg");//读取图片

    split(img,channels);//使用split()函数,分离img的B.G.R三个通道
    Mat B = channels.at(0);//下标读取 默认顺序B-G-R
    Mat G = channels.at(1);
    Mat R = channels.at(2);

    imshow("原图", img);//显示原图
    imshow("blue", B);  //显示三通道图像
    imshow("green", G);
    imshow("red", R);
    waitKey(0);
    return 0;

 分离后的三个通道的图像为灰度图像,表示强度

2.通道合并

apl:merge()


官方定义:

void merge(InputArrayOfArrays mv, OutputArray dst);

参数解释:

(1)mv : 同通道的拆分。为拆分后的多通道的图像数组。

(2)dst : 存放合并后的图像。

代码演示:

#include <opencv2/imgcodecs.hpp>       //imread
#include <opencv2/highgui.hpp>         //imshow  waitKey
 
using namespace std;
using namespace cv;

int main()

    vector<Mat> channels;//声明vector,作为分离后三个通道的图像的保存容器
    Mat img = imread("C:/r/bear.jpg");//读取图片

    split(img,channels);//使用split()函数,分离img的B.G.R三个通道

    Mat dst;
    merge( channels,dst);//合并三通道
    imshow("outPutArray", dst);//展示合并后的熊大
    waitKey(0);
    return 0;
重新获得颜色的熊大


 三、图像的属性

 下面进行列举 

1.列举解释

  • src.size() 返回图像尺寸

size中的参数先宽度(width)后高度(height)

src.size().width  ==  src.cols       (宽度==列)

src.size().heght  ==  src.rows (高度==行)

  • src.depth() 返回深度

 度量每一个像素每一个通道的精度,位数(bit)(0~6)

数值越大,精度越高

  • src.channels() 返回通道数
  • src.elemSize() 返回一个元素所占的字节数 

 一个元素单通道的字节数 * 通道数

  • src.elemSize1() 返回一个元素单通道的所占字节数

 src.elemSize1()==src.elemSize() / src.channels()

  • src.total() 返回像素总数
  • src.step 返回每一行的步长(字节数) 每一行所有元素的字节总量

 src.step==宽度*通道数

  • src.step1() 

src.step1() == e1()src.step / src.elemSize1()

  • src.step [0]  一行元素的字节数
  • src.step [1]  一个元素的字节数
  • src.step1 (0)  一行元素的通道数
  • src.step1 (1)  一个元素的通道数
  • src.isContinuous()  判断src是否在内存上连续

src.isContinuous()?"true":"false"

  • src.isSubmatrix()  判断src是否为子矩阵
  • src.type()  元素类型以及矩阵的通道个数

 2.表格汇总

apl返回值
src.size()图像尺寸
src.depth()图像深度id
src.channels()预想通道数
src.elemSize()一个元素所占字节数
src.elemSize1()一个元素单通道的所占字节数
src.total()像素总数
src.step每一行的步长(字节数)
src.step1()
src.step [0]一行元素的字节数
src.step [1]一个元素的字节数
src.step1 (0)一行元素的通道数
src.step1 (1)一个元素的通道数
src.isContinuous()判断src是否在内存上连续
src.isSubmatrix()判断src是否为子矩阵
src.type()元素类型以及矩阵的通道个数

总结

以上就是今天的笔记,内容涉及到图像读取的at()操作,图像的拆分和合并的参数解释和代码,以及一些常用的图像属性的内置函数。

以上是关于初学opencv c++学习笔记图像的相关操作及属性的主要内容,如果未能解决你的问题,请参考以下文章

OpenCv初学者学习笔记:图像视频的加载与显示

C++下opencv学习笔记(图像的简单读取丶显示与存储)

c++ 与opencv 学习笔记五-图像插值01

[opencv学习笔记] jiazhigang 30讲源码C++版本(含Makefile)

Opencv学习笔记--图像处理的基本操作

OpenCV3学习笔记整理(一期)