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

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

  • 目录

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

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

    1.通道拆分

    2.通道合并

     三、图像的属性

    1.列举解释

     2.表格汇总

    总结




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

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

apI:at()


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

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

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

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

  • <>中为图像元素的类型。uchar为无符号字符型,Vec3b等于vector,表示一个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        //imread
#include          //imshow  waitKey
 
using namespace std;
using namespace cv;

int main()
{
    vector 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;
}

初学opencv c++学习笔记(四)图像的相关操作及属性_第1张图片初学opencv c++学习笔记(四)图像的相关操作及属性_第2张图片

初学opencv c++学习笔记(四)图像的相关操作及属性_第3张图片初学opencv c++学习笔记(四)图像的相关操作及属性_第4张图片

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

2.通道合并

apl:merge()


官方定义:

void merge(InputArrayOfArrays mv, OutputArray dst);

参数解释:

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

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

代码演示:

#include        //imread
#include          //imshow  waitKey
 
using namespace std;
using namespace cv;

int main()
{
    vector 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;
}
初学opencv c++学习笔记(四)图像的相关操作及属性_第5张图片 重新获得颜色的熊大


 三、图像的属性

 下面进行列举 

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++,图像处理,计算机视觉,人工智能)