一、图像
1、图像信息
Q:图像在计算机中怎么储存?
A:在计算机中用一般用M x N的矩阵来表示一幅尺寸大小为M x N的数字图像,矩阵元素的值就是该图像对应位置上的像素值。
对于计算机本地磁盘中的彩色图像,单机鼠标右键,选择“属性”,可以看到一幅图像的基本信息。
2、图像种类
1)二值图像:
Q:什么是二值图像?
A: 一幅二值图像的二维矩阵仅由 0、1 两个值构成,“0”代表黑色,“1”代表白色。二值图像可以看成是灰度图像的一个特例。
二值图像通常用于文字、线条图的扫描识别(OCR)和掩膜图像的存储。
2)灰度图:
Q:什么是灰度图?
A: 灰度图是每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑色与白色两种颜色,但是灰度图像在黑色与白色之间还有许多级的颜色深度。
3)彩色图:
Q:什么是彩色图?
A: 彩色图的每个像素通常是由红(R)、绿(G)、蓝(B)三个分量来表示的。RGB 图像每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩阵中,由于每一像素的颜色需由 R、G、B 三个分量来表示,M、N 分别表示图像的行列数,三个M x N的二维矩阵分别表示各个像素的 R、G、B 三个颜色分量。RGB图像的数据类型一般为 8 位无符号整形,通常用于表示和存放真彩色图像。
二、图像转化
1、分离彩色图三个通道
彩色图像在计算机中一般存储方式为 3 通道图像。图像的每一个像素都是由三个数字组成的向量量化的,最常见的是由 R,G ,B 三个分量来量化的。RGB模型的这三个元素的数值分别代表了三种基色,红、绿、蓝的亮度。我们可以通过split函数来分离这三个通道。
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/types_c.h> using namespace cv; using namespace std; int main() { Mat srcImage = imread("...\\dog.jpg"); if (!srcImage.data) return 1; imshow("srcImage", srcImage); vector<Mat> planes; split(srcImage, planes); imshow("B", planes[0]); imshow("G", planes[1]); imshow("R", planes[2]); waitKey(0); return 0; }
运行结果如图所示
在彩色图像处理中,一般先分离通道,分别处理每一个单通道后再合并。
2、图像灰度化处理
#include <opencv2\imgproc\imgproc.hpp> #include <opencv2\highgui\highgui.hpp> #include <opencv2/imgproc/types_c.h> using namespace cv; using namespace std; int main() { //读取源图像并转化为灰度图像 cv::Mat srcImage = imread("...\\dog.jpg"); if (!srcImage.data) return 1; //读取源图像并转化为灰度图像 Mat srcGray; cvtColor(srcImage, srcGray, CV_RGB2GRAY); //显示源图像及灰度图像 imshow("srcImage", srcImage); imshow("srcGray", srcGray); waitKey(0); return 0; }
运行结果如图所示: