📖作者介绍:22级树莓人(计算机专业),热爱编程<目前在c++和openCv阶段>——目标Windows,MySQL,Qt,数据结构与算法,openCv,Linux,多线程,会持续分享学习成果和小项目的
📖作者主页:热爱编程的小K
📖专栏链接:OpenCV🎉欢迎各位→点赞👏 + 收藏💞 + 留言🔔
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🐾
💯文章目录
- 一、图像通道
- 二、读取图像
- 1、Mat结构
- 2、格式化打印图像数据
- 3、访问或设置像素强度值
- 4、imread函数读取图片
- 三、显示图像
- 四、保存图像
- 五、综合案例讲解
- 1、测试上面的函数
- 2、格式化打印效果
- 3、保存图片效果展示
- 4、综合代码
一、图像通道
- 颜色通道
- RGB 图像有4 个默认通道:红色、绿色和蓝色各有一个通道,以及一个用于编辑图像复合通道(主通道)
- 彩色深度
8位色,每个像素所能显示的彩色数为2的8次方,即256种颜色。
16位增强色,16位彩色,每个像素所能显示的彩色数为2的16次方,即65536种颜色。
24位真彩色,每个像素所能显示的彩色数为24位,即2的24次方,约1680万种颜色。
32位真彩色,即在24位真彩色图像的基础上再增加一个表示图像透明度信息的
Alpha
通道。
Alpha
通道:一张图片的透明和半透明度
CV_8UC3
系列解读
-
函数原型
CV_<bit_depth>(S|U|F)C<number_of_channels>
-
bit_depth
:像素点占用空间大小,bit
-
S|U|F
:S:signed int
——有符号U:unsigned int
——无符号F:float
——单精度浮点
-
number_of_channels
- 1 单通道图像,即为灰度图像
- 2 双通道图像
- 3 三通道图像
- 4 带
Alpha
通道的彩色图像,四通道图像
二、读取图像
1、Mat结构
大家可以用如下图的方式查看,需要用到哪个调用哪个,这里只是简单的介绍
我们可以看一下库函数
class Mat
{
public:
/*
flag:
1.数字签名
2.维度
3.通道数
4.连续性
*/
int flags;
int dims; //数据维数
int rows,cols; //数据行列
uchar *data; //存储的数据
const uchar* datastart; //数据开始
const uchar* dataend; //数据结束
const uchar* datalimit; //数据边界
//其他成员
//.....
//其他方法
//.....
public: //构造方式
// 默认构造函数 Mat A;
Mat ()
// 常用构造函数 Mat A(10,10,CV_8UC3);
Mat (int rows, int cols, int type)
//Mat A(300, 400, CV_8UC3,Scalar(255,255,255));
Mat (int ndims, const int *sizes, int type, const Scalar &s)
Mat (Size size, int type)
Mat (int rows, int cols, int type, const Scalar &s)
Mat (Size size, int type, const Scalar &s)
Mat (int ndims, const int *sizes, int type)
Mat (const Mat &m)
Mat (int rows, int cols, int type, void *data, size_t step=AUTO_STEP)
Mat (Size size, int type, void *data, size_t step=AUTO_STEP)
Mat (int ndims, const int *sizes, int type, void *data, const size_t *steps=0)
Mat (const Mat &m, const Range &rowRange, const Range &colRange=Range::all())
//Mat D (A, Rect(10, 10, 100, 100) );
Mat (const Mat &m, const Rect &roi)
Mat (const Mat &m, const Range *ranges)
};
2、格式化打印图像数据
函数原型
Ptr<Formatted> format(InputArray mtx, Formatter::FormatType fmt)
- 第一个参数是图像名称
- 第二个参数是打印方式
FMT_DEFAULT
= 0,FMT_MATLAB
= 1,FMT_CSV
= 2,FMT_PYTHON
= 3,FMT_NUMPY
= 4,这也是py的一种打印方式,数组FMT_C
= 5,C语言方式打印
3、访问或设置像素强度值
函数原型
Scalar 它将各个通道的值构成一个整体,赋给具有相同通道数的矩阵元素,通俗点就是一个复合数据
scalar(1,2,3);
分别把每一个像素点颜色通道设置为1,2,3,注意这里是BGR
4、imread函数读取图片
Mat imread( const String& filename, int flags = IMREAD_COLOR );
filename
:文件路径flags
:显示方式
flags | 解释 |
---|---|
IMREAD_REDUCED_COLOR_4 = 33 | 3通道BGR彩色图像,使图像大小减小1/4 |
IMREAD_REDUCED_GRAYSCALE_8 =64 | 单通道灰度图像,并将图像尺寸减小1/8 |
IMREAD_REDUCED_COLOR_8 = 65 | 3通道BGR彩色图像,使图像大小减小1/8 |
IMREAD_IGNORE_ORIENTATION = 128 | 不要根据EXIF的方向标志旋转图像 |
IMREAD_UNCHANGED = -1 | 按原样返回加载的图像(带有alpha通道,否则会被裁剪) |
IMREAD_GRAYSCALE = 0 | 单通道灰度图像 |
IMREAD_COLOR = 1 | 3通道BGR彩色图像 |
IMREAD_ANYDEPTH = 2 | 16位/32位图像,其他则转换为8位 |
IMREAD_ANYCOLOR = 4 | 图像以任何可能的颜色格式读取 |
IMREAD_LOAD_GDAL = 8 | gdal驱动程序加载映像 |
IMREAD_REDUCED_GRAYSCALE_2 =16 | 单通道灰度图像,并将图像大小减小1/2 |
IMREAD_REDUCED_COLOR_2 = 17 | 3通道BGR彩色图像,使图像大小减小1/2 |
IMREAD_REDUCED_GRAYSCALE_4 =32 | 单通道灰度图像,并将图像尺寸减小1/4 |
三、显示图像
imshow()显示图片
imshow(const string& str,InputArray mat);
str
:窗口名称mat
:图像
销毁窗口
destroyAllWindows()
:销毁所有窗口destroyWindow(const char* windowName)
:销毁指定窗口
四、保存图像
imwrite()函数保存图片
函数原型
bool imwrite( const String& filename, InputArray img,
const std::vector<int>& params = std::vector<int>());
filename
:保存的文件名img
:图像params
:设置图片质量,压缩率,一般不写
五、综合案例讲解
1、测试上面的函数
void testMat()
{
//No.1构造方式
Mat img(10, 10, CV_8UC1);
imshow("1", img);
//No.2 BGR
Mat img2(300, 300, CV_8UC3, Scalar(0, 255, 0));
imshow("2", img2);
//No.3 clone方法拷贝
Mat img3 = img2.clone();
imshow("3", img3);
//No.4
Mat img4;
img3.copyTo(img4);
imshow("4", img4);
//No.5
Mat img5 = imread("mm.jpg", IMREAD_GRAYSCALE);
imshow("5", img5);
//No.6
Mat img6 = imread("mm.jpg", IMREAD_REDUCED_COLOR_2);
imshow("6", img6);
}
这里讲一下拷贝
Mat img3 = img2.clone(); imshow("3", img3);
Mat img4; img3.copyTo(img4); imshow("4", img4);
clone()和copyTo()
:第一个是拷贝调用者,第二个是拷贝到
下面展示一下效果
2、格式化打印效果
void print()
{
Mat img(10, 10, CV_8UC1);
cout << "C:" << endl;
cout << format(img, Formatter::FMT_C) << endl;
cout << "csv:" << endl;
cout << format(img, Formatter::FMT_CSV) << endl;
cout << "py:" << endl;
cout << format(img, Formatter::FMT_PYTHON) << endl;
}
效果展示
3、保存图片效果展示
void testSaveimg(const char* filename)
{
Mat img = imread("mm.jpg", IMREAD_REDUCED_COLOR_2);
imwrite(filename, img);
}
这时候我们打开项目文件夹,就会发现,多了一个图片
4、综合代码
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
void testMat()
{
//No.1构造方式
Mat img(10, 10, CV_8UC1);
imshow("1", img);
//No.2 BGR
Mat img2(300, 300, CV_8UC3, Scalar(0, 255, 0));
imshow("2", img2);
//No.3 clone方法拷贝
Mat img3 = img2.clone();
imshow("3", img3);
//No.4
Mat img4;
img3.copyTo(img4);
imshow("4", img4);
//No.5
Mat img5 = imread("mm.jpg", IMREAD_GRAYSCALE);
imshow("5", img5);
//No.6
Mat img6 = imread("mm.jpg", IMREAD_REDUCED_COLOR_2);
imshow("6", img6);
}
void print()
{
Mat img(10, 10, CV_8UC1);
cout << "C:" << endl;
cout << format(img, Formatter::FMT_C) << endl;
cout << "csv:" << endl;
cout << format(img, Formatter::FMT_CSV) << endl;
cout << "py:" << endl;
cout << format(img, Formatter::FMT_PYTHON) << endl;
}
void testSaveimg(const char* filename)
{
Mat img = imread("mm.jpg", IMREAD_REDUCED_COLOR_2);
imwrite(filename, img);
}
int main()
{
//testMat();
//print();
testSaveimg("love.jpg");
waitKey(0);
destroyAllWindows();
return 0;
}