文章选取大部分网络资源,侵删。
统计模型 (Statistical Models)
一般贝叶斯分类器 (Normal Bayes Classifier)
K-近邻(K-Nearest Neighbors)
支持向量机 (Support Vector Machines)
决策树 (DecisionTrees)
提升(Boosting)
梯度提高树(Gradient Boosted Trees)
随机树 (Random Trees)
超随机树 (Extremely randomized trees)
期望最大化 (Expectation Maximization)
神经网(Neural Networks)
加载一个图像成为mat格式对象
Scalar intensity = img.at(y, x);
或者 Scalar intensity = img.at(Point(x, y));
Vec3f intensity = img.at(y, x);
float blue = intensity.val[0];
float green = intensity.val[1];
float red = intensity.val[2];
namedWindow(“Window Title”, WINDOW_AUTOSIZE)
imshow根据窗口名称显示图像到指定的窗口上去,第一个参数是窗口名称,第二参数是Mat对象
把图像从一个彩色空间转换到另外一个色彩空间
第一参数源图像、第二参数色彩空间转换之后的图像、第三个参数表示源转向目标色彩空间
例 : cvtColor( image, gray_image, COLOR_BGR2GRAY );
灰度图像
img.at(y, x) = 128;
RGB三通道图像
img.at(y,x)[0]=128; // blue
img.at(y,x)[1]=128; // green
img.at(y,x)[2]=128; // red
空白图像赋值
img = Scalar(0);
ROI选择
Rect r(10, 10, 100, 100);
Mat smallImg = img®;
Vec3b对应三通道的顺序是blue、green、red的uchar类型数据。
Vec3f对应三通道的float类型数据
把CV_8UC1转换到CV32F1实现如下:
src.convertTo(dst, CV_32F);
只有8位、16位的PNG、JPG、Tiff格式而且是单通道或者三通道的BGR的图像才可以通过这种方式保存
保存PNG格式的时候可以保存透明通道的图片
可以指定压缩参数
Mat.ptr(int i=0) 获取像素矩阵的指针,索引i表示第几行,从0开始计行数。
const uchar* current= myImage.ptr(row ); 获得当前行指针
p(row, col) =current[col] 获取当前像素点P(row, col)的像素值
saturate_cast(-100),返回 0。
saturate_cast(288),返回255
saturate_cast(100),返回100
这个函数的功能是确保RGB值得范围在0~255之间
定义掩膜:Mat kernel = (Mat_(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D( src, dst, src.depth(), kernel );
其中src与dst是Mat类型变量、src.depth表示位图深度,有32、24、8等。
Mat对象OpenCV2.0之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。分了两个部分,头部与数据部分
IplImage是从2001年OpenCV发布之后就一直存在,是C语言风格的数据结构,需要开发者自己分配与管理内存,对大的程序使用它容易导致内存泄漏问题
void copyTo(Mat mat)
void convertTo(Mat dst, int type)
Mat clone()
int channels()
int depth()
bool empty();
uchar* ptr(i=0)
输出图像的内存是自动分配的
使用OpenCV的C++接口,不需要考虑内存分配问题
赋值操作和拷贝构造函数只会复制头部分
使用clone与copyTo两个函数实现数据完全复制
构造函数
Mat M(2,2,CV_8UC3, Scalar(0,0,255))
其中前两个参数分别表示行(row)跟列(column)、第三个CV_8UC3中的8表示每个通道占8位、U表示无符号、C表示Char类型、3表示通道数目是3,第四个参数是向量表示初始化每个像素值是多少,向量长度对应通道数目一致
创建多维数组 cv::Mat::create
int sz[3] = {2,2,2};
Mat L(3,sz, CV_8UC1, Scalar::all(0));
调整图像亮度和对比度属于像素变换-点操作
像素变换 – 点操作
邻域操作 – 区域
Mat new_image = Mat::zeros( image.size(), image.type() ); 创建一张跟原图像大小和类型一致的空白图像、像素值初始化为0
saturate_cast(value)确保值大小范围为0~255之间
Mat.at(y,x)[index]=value 给每个像素点每个通道赋值
Smooth/Blur 给图像预处理时候减低噪声
使用Smooth/Blur操作其背后是数学的卷积计算
通常这些卷积算子计算都是线性操作,所以又叫线性滤波
拉普拉斯金字塔 – 用来重建一张图片根据它的上层降采样图片
降采样之后图像大小是原图像MxN的M/2 x N/2 ,就是对原图像删除偶数行与列,即得到降采样之后上一层的图片。
高斯金子塔的生成过程分为两步:
- 对当前层进行高斯模糊
- 删除当前层的偶数行与列
即可得到上一层的图像,这样上一层跟下一层相比,都只有它的1/4大小。
上采样(cv::pyrUp) – zoom in 放大
降采样 (cv::pyrDown) – zoom out 缩小
图像阈值,即图像的分割基准,基于此可完成图像的二值化(threshold binary),阈值反二值化(threshold binary Inverted),截断 (truncate),阈值取零 (threshold to zero),阈值反取零 (threshold to zero inverted)
图像二值化可用于OCR成图像的分割(也是最为简单的一种)。这种分割是基于图像像素值级别的差异,且一般的对象是灰度图像。
(参考https://blog.csdn.net/qq_38701868/article/details/89215881)
图像直方图(Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。这种直方图中,横坐标的左侧为纯黑、较暗的区域,而右侧为较亮、纯白的区域。
CV 领域常借助图像直方图来实现图像的二值化。
void calcHist(
const Mat* images, //输入的数组或数据集,需为相同的深度(CV_8U 或 CV_32F)和相同的尺寸
int nimages, //输入数组的个数,第一个参数中存放了多少张 “图像”,有几个原数组
const int* channels, //需要统计的通道(dim)索引 ,第一个数组通道从 0 到 images[0].channels() - 1,而第二个数组通道从 images[0].channels() 计算到 images[0].channels() + images[1].channels() - 1。
InputArray mask, //可选的操作掩码,用于标记出统计直方图的数组元素数据,如果此掩码不为空,那么它必须为 8 位,并且与 images[i] 有同样的大小和尺寸。用于标记出统计直方图的数组元素数据。
OutputArray hist, //输出的目标直方图 ,二维数组
int dims, //需要计算的直方图的维数,正数,不大于 CV_MAX_DIMS(在 OpenCV3 中等于 32)
const int* histSize, //存放每个直方图尺寸的数组
const float** ranges, //每一维数值的取值范围
bool uniform = true, //指示直方图是否均匀的标识符
bool accumulate = false //累计标识符,主要是允许多从多个阵列中计算单个直方图,或者用于在特定的时间更新直 true,直方图在配置阶段不会被清零方图。
)
void minMaxLoc(
InputArray src, //输入的单通道阵列
double* minVal, //返回最小值的指针
double* maxVal = 0, //返回最大值的指针
Point* minLoc = 0, //返回最小位置的指针(二维)
Point* maxLoc = 0, //返回最大位置的指针(二维情况下)
InputArray mask = noArray() //选择子阵列的可选掩膜
)