前言
本文为本系列第一篇文章,涉及有关opencv中图像处理的基本概念及操作,用于快速入门。
像素与通道
基本概念
相比起人眼所看到的色彩斑斓的画面,在数理世界中,图像仅仅被表示为一个个矩阵。
矩阵的x-y坐标所表示位置对应的区域被称为像素
,比如上图中橙色区域所示。
色彩是由不同颜色通道组合而成的。上图有三个颜色通道,分别是三原色红(pixel[2])、绿(pixel[1])、蓝(pixel[0])。
- 对于黑白图像,仅需要一个通道,存储的是0/1值,所以也被称为二进制图像
- 对于灰度图像,需要两个通道
- 对于彩色图像,则需要三个通道
OpenCV相关实现
在Opencv中有一个矩阵(Matrix)类------Mat,它可用来表示任意类型和大小的矩阵。
cv::Mat::at<typenamet>(row,col)
可用于获取单个像素。- 灰度图像的typenamet可使用任何数字格式
- 彩色图像的typenamet对应Vec3b类(名称释义:向量,三个组件,一个字节)
图像灰度处理
示例代码
cpp
#include "opencv2/core.hpp"
#include "opencv2/highgui.hpp"
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
Mat gray = imread("图片路径.jpg", IMREAD_GRAYSCALE);
//此处默认在当前项目路径下生成一张名为Gray.jpg的灰度图片,也可自定义路径
imwrite("Gray.jpg", gray);
//用于展示图片的框体名字叫Gray pic
imshow("Gray pic", gray);
//等待用户按下按键后退出
waitKey(0);
return 0;
}
关于imread中的可选参数:
- 上述代码中使用的
IMREAD_GRAYSCALE
将图像转为8位无符号的灰度图像 IMREAD_COLOR
将图像转为8位无符号的彩色图像IMREAD_UNCHANGED
如果原图是16位/32位的,返回对应深度的图像;如果不是,返回8位图像
参考资料
- 《Learn Opencv 4 by Building Projects Second Edition》David Millan Escriva等著