1.1颜色
1.1.1 RGB 颜色空间
通过一个像素的 Red,Green,Blue 的值,就可以确定这个像素的颜色。当然计算机中没办法模拟一种颜色完全连续的从最暗到最亮的变化,只能综合考虑计算机的控制能力及人眼的分辨能力,采用三个字节(3*8 个二进制位)来分别表示一种一个像素的 Red,Green,和 Blue 发光强度的值,从而达到表现不同颜色的目的。这就是常见的 RGB 格式。RGB 的每个元素在计算机内存中通常为占用 1 个字节,1 个字节等于 8 个 bit 位,所以 RGB 每个元素的取值范围为:0~256 (2 的 8 次方),三色组合共有256x256x256=16777216种颜色
1.12HSV颜色空间
HSV 是一种将 RGB 色彩空间中的点在倒圆锥体中的表示方法,也就是说 HSV 和 RGB 是对应的,只是两个不同表现方式。
色调(H): 用角度度量,取值范围为 0°~360°,从红色开始按逆时针方向计算,红色为 0°,绿色为 120°, 蓝色为 240°。它们的补色是:黄色为 60°,青色为 180°, 品红为 300°;
饱和度(S)表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为 0,饱和度达到最高。通常取值范围为 0%~100%,值越大,颜色越饱和。
亮度(V)表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为 0%(黑)到 100%(白)。
1.2 图像的表达
1.2 .1 图像的基本类型
常见的图像类型有以下几种:二值化图像: 一幅二值图像的二维矩阵仅由 0、1 两个值构成,“0” 代表黑色,“1” 代白色。二值图像通常用于文字、线条图的扫描识别(OCR)和掩膜图像的存储。
灰度图像: 灰度图像矩阵元素的取值范围通常为 [0,255]。因此其数据类型一般为 8 位无符号整数的(int8),“0” 表示纯黑色,“255” 表示纯白色,中间的数字表示由黑到白的过渡色。灰度图像也可以用双精度数据类型(double)表示,像素的值域为 [0,1],0 代表黑色,1 代表白色,0 到 1 之间的小数表示不同的灰度等级。可看成是灰度图像的一个特例。
索引图像:索引除了存放图像的二维矩阵外,还包括一个称之为颜色索引矩阵 MAP 的二维数组。MAP 的大小由存放图像的矩阵元素值域决定,矩阵元素值域为 [0,255],则 MAP 矩阵的大小为 256Ⅹ3,用 MAP=[RGB] 表示。MAP 中每一行的三个元素分别指定该行对应颜色的红、绿、蓝单色值,MAP 中每一行对应图像矩阵像素的一个灰度值,若某一像素的灰度值为 64,则该像素就与 MAP 中的第 64 行建立了映射关系,该像素在屏幕上的实际颜色由第 64 行的 [RGB] 组合决定。当图像在屏幕上显示时,每一像素的颜色由存放在矩阵中该像素的灰度值作为索引通过检索颜色索引矩阵 MAP 得到。索引图像的数据类型一般为 8 位无符号整形(int8),相应索引矩阵 MAP 的大小为 256Ⅹ3,因此一般索引图像只能同时显示 256 种颜色,但通过改变索引矩阵,颜色的类型可以调整。索引图像的数据类型也可采用双精度浮点型(double)。索引图像一般用于存放色彩要求比较简单的图像,若图像的色彩比较复杂,就要用到 RGB 真彩色图像。
真彩色 RGB 图像:RGB 图像与索引图像一样都可以用来表示彩色图像。与索引图像一样,它分别用红(R)、绿(G)、蓝(B)三原色的组合来表示每个像素的颜色。但RGB 图像每一个像素的颜色值(由 RGB 三原色表示)直接存放在图像矩阵中,由于每一像素的颜色需由 R、G、B 三个分量来表示,M、N 分别表示图像的行列数,三个 M x N 的二维矩阵分别表示各个像素的 R、G、B 三个颜色分量。RGB 图像的数据类型一般为 8 位无符号整形,通常用于表示和存放真彩色图像
1.2.2 图像的大小、深度和通道
在 OpenCV 中,定义的图像一般会包含图像的大小、深度和通道等几个元素。一般用 cv::Mat 去定义一个图像,例:cv::Mat img(512, 512, CV_8UC3, Scalar(255, 255, 255));其中,CV_8UC3 中 8 表示 8bit; U 表示无符号整型数 S = 符号整型 F = 浮点型; C3 表示 3 通道;同理,CV_8SC1 即表示 8bit 带符号整型单通道类型的图像;CV_32FC2 是指一个 32 位浮点型双通道矩阵,这两个例子中的数字就代表了位深度,数字越大单个通道能表示的颜色就越细,可以理解位调节的粒度。
单通道和多通道的区别为:单通道图像由一字节就可以表示一个像素的色彩(明暗),而三通道则需要 3 个字节才能表示一个像素的色彩,RGB 彩色图一般就是三通道,每个通道表示一个颜色。
2.opencv的使用
//前置
#include
#include
#include
#include
using namespace cv;
using namespace std;
//图像的读取
imread( const String& filename, int flags = IMREAD_COLOR )
//参数解读: filename 文件路径,可以是相对路径也可以是绝对路径。
//视频的读取
VideoCapture();//默认的构造函数
VideoCapture(const String& filename);//filename 为需要打开视频的路径
VideoCapture(int index);//如果需要打开本地摄像头,使 index = 0 即可, 插了摄像头的话 使用 index =1
//
实际:
2.1抓拍
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
//抓拍
string writePath = "D:/temp/ ";//定义路径
string append1(string a, int i)//向string函数中插入数字
{
stringstream ss;
ss << i;
a.append(ss.str());
return a;
}
int main() {
VideoCapture capture(0);
string name;
namedWindow("hello", 5);
int i = 0;
while (1) {
Mat frame;
capture >> frame;
if (32 == waitKey(20))
{ //空格拍照
name =append1(writePath,i) + ".jpg";
imwrite(name, frame);
cout << name << endl;
i++;
}
if (97 == waitKey(10))
{ //'a'退出
break;
}
imshow("hello", frame);
}
}
2.2颜色变换
void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
code:表示图像转换的类型,dstcn为输出图像的通道数,默认值为 0,也就是默认和源图像保持一致。
亦可以对每一个点进行单独设置
int main()
{
//像素操作
Mat src, dst;
src = imread("D:/本机图片/test.jpg");
resize(src, src, Size(), 0.5, 0.5);
if (src.empty())//检测目标是否存在
{
printf("can not load image \n");
return -1;
}
namedWindow("input");
imshow("input", src);
Mat drt;
cvtColor(src, drt, COLOR_BGR2GRAY);//
imshow("1", drt);
dst.create(src.size(), src.type());
for (int row = 0; row < src.rows; row++)
{
for (int col = 0; col < src.cols; col++)
{
int b = src.at(row, col)[0];
int g = src.at(row, col)[1];
int r = src.at(row, col)[2];
dst.at(row, col)[0] = max(b,max(g,r));
dst.at(row, col)[1] = max(b, max(g, r));
dst.at(row, col)[2] = max(b, max(g, r));
}
}
namedWindow("output");
imshow("output", dst);
waitKey();
}
2.3使用各类函数的操作
GaussiaBlur () 高斯模糊,
void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
double sigmaX, double sigmaY = 0,
int borderType = BORDER_DEFAULT );
ksize 该参数是 Size 类型的,是一个 OpenCV 自定义的数据类型。用于指定图像或矩形大小的模板类。包含两个成员变量 width 和 height。在该函数下,width 和 height 只能是正奇数,数字越大模糊效果越明显。如果为 0 了,则该参数无效,使用 sigmaX 和 sigmaY 来决定模糊程度。
sigmaX, sigmaY 分别为 X 和 Y 方向的高斯核标准差。如果 sigmaY 为 0,它将被设置为和 sigmaX 相等。这一对参数的作用同 ksize ,使用这两个参数中的一种即可。
Canny () 边缘检测,
void Canny( InputArray image, OutputArray edges,
double threshold1, double threshold2,
int apertureSize = 3, bool L2gradient = false );
threshold1 threshold2 这是两个阈值,通过调节这两个阈值来调节边缘检测的效果。后面两个参数无特殊要求保持默认。
dilate () 图像扩大
void dilate( InputArray src, OutputArray dst, InputArray kernel );
该函数可以对输入图像用特定结构元素进行膨胀操作,该结构元素确定膨胀操作过程中的邻域的形状,各点像素值将被替换为对应邻域上的最大值 kernel:
Mat kernel = getStructuringElement(MORPH_RECT, Size(3,3));//size中数字越大,效果越明显
erode () 图像侵蚀:
void erode( InputArray src, OutputArray dst, InputArray kernel );
图像设置大小:
resize(src, src, Size(), 0.2, 0.2);
裁减图像:
Rect roi(200, 100, 300, 300)
img x=img(roi)
参数含义:定义该矩形左上角坐标为(200,100),长宽为300x300
实际效果:
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include "iostream"
using namespace std;
using namespace cv;
int main() {
string path = "D:/本机图片/test.jpg";
Mat img = imread(path);
resize(img, img, Size(), 0.3, 0.3);
Mat imgGray, imgBlur, imgCanny, imgDil, imgErode, imgcop;
cvtColor(img, imgGray, COLOR_BGR2GRAY);
GaussianBlur(img, imgBlur, Size(3, 3), 3, 0);
Canny(img, imgCanny, 25, 75);
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
dilate(imgCanny, imgDil, kernel);
erode(imgDil, imgErode, kernel);
Rect roi(200, 100, 300, 300);
imgcop = img(roi);
imshow("Image", img);
imshow("Gray", imgGray);
imshow("Blur", imgBlur);
imshow("Canny", imgCanny);
imshow("Dilation", imgDil);
imshow("Erode", imgErode);
waitKey(0);
return 0;
}