Opencv学习----矩阵操作-矩阵转换(cv::dct、cv::dft等)

5.2 矩阵变换

cv::dct (InputArray src, OutputArray dst, int flags=0)

执行一维或二维数组的正向或反向离散余弦变换。

该函数通过查看输入数组的标志和大小来选择操作模式:

(1)如果(flags & DCT_INVERSE) == 0,则函数执行正向一维或二维转换。否则,它就是一维或二维的逆变换。

(2)如果(flags & DCT_ROWS) != 0,函数对每一行执行一维变换。

(3)如果数组是单列或单行,则函数执行一维变换。

(4)如果以上都不正确,则函数执行2D转换。

cv::dft (InputArray src, OutputArray dst, int flags=0, int nonzeroRows=0)

对一维或二维浮点数组执行正向或反向离散傅里叶变换。

对于真实的(单通道)数据,傅里叶正变换的输出频谱或傅里叶反变换的输入频谱可以用一种称为CCS(复共轭对称)的压缩格式表示。它是从IPL (Intel*图像处理库)借鉴的。2D CCS频谱是这样的:

Opencv学习----矩阵操作-矩阵转换(cv::dct、cv::dft等)_第1张图片

cv::divide (InputArray src1, InputArray src2, OutputArray dst, double scale=1, int dtype=-1)

cv::divide (double scale, InputArray src2, OutputArray dst, int dtype=-1)

按数组对两个数组或标量的每个元素进行除法。

cv::eigen (InputArray src, OutputArray eigenvalues, OutputArray eigenvectors=noArray())

计算对称矩阵的特征值和特征向量。

函数cv::eigen只计算特征值,或者说对称矩阵src的特征值和特征向量:

src*eigenvectors.row(i).t() = eigenvalues.at(i)*eigenvectors.row(i).t()

cv::eigenNonSymmetric (InputArray src, OutputArray eigenvalues, OutputArray eigenvectors)

计算非对称矩阵的特征值和特征向量(仅实特征值)。

cv::flip (InputArray src, OutputArray dst, int flipCode)

围绕垂直、水平或两个轴翻转二维数组。

函数cv::flip以三种不同的方式翻转数组(行和列索引都是基于0的)之一:

使用该功能的示例场景如下:垂直翻转图像(flipCode == 0)以在左上角和左下角图像原点之间切换。这是Microsoft Windows * OS上视频处理的典型操作。使用随后的水平移位和绝对差值计算来水平翻转图像以检查垂直轴对称(flipCode> 0)。同时水平和垂直翻转图像,随后进行移位和绝对差值计算,以检查中心对称性(flipCode <0)。反转点数组的顺序(flipCode> 0或flipCode == 0)。

参数

src

输入数组。

dst

输出与src大小和类型相同的数组。

flipCode

用于指定如何翻转数组的标志; 0表示绕x轴翻转,正值(例如1)表示绕y轴翻转。负值(例如,-1)表示在两个轴周围翻转。

 

Opencv学习----矩阵操作-矩阵转换(cv::dct、cv::dft等)_第2张图片Opencv学习----矩阵操作-矩阵转换(cv::dct、cv::dft等)_第3张图片Opencv学习----矩阵操作-矩阵转换(cv::dct、cv::dft等)_第4张图片Opencv学习----矩阵操作-矩阵转换(cv::dct、cv::dft等)_第5张图片

cv::idct (InputArray src, OutputArray dst, int flags=0)

计算一维或二维数组的反离散余弦变换。

cv::idft (InputArray src, OutputArray dst, int flags=0, int nonzeroRows=0)

计算一维或二维数组的离散傅里叶反变换。

cv::mulTransposed (InputArray src, OutputArray dst, bool aTa, InputArray delta=noArray(), double scale=1, int dtype=-1)

计算矩阵的乘积及其移位。

cv::perspectiveTransform (InputArray src, OutputArray dst, InputArray m)

执行向量的透视矩阵变换。

cv::transform (InputArray src, OutputArray dst, InputArray m)

执行每个数组元素的矩阵转换。

函数cv::transform对数组src的每个元素进行矩阵变换,并将结果存储在dst中:

m.cols=src.channels()

m.cols=src.channels()+1

N通道阵列src的每个元素都被解释为N元素向量,该N元素向量使用M x N或M x (N+1)矩阵M转换为M元素向量——输出阵列dst的对应元素。

该函数可用于N维点的几何变换、任意线性颜色空间变换(如各种RGB到YUV变换)、图像通道的变换等。

cv::transpose (InputArray src, OutputArray dst)

转置一个矩阵。

cv::vconcat (const Mat *src, size_t nsrc, OutputArray dst)

将垂直连接应用于给定的矩阵。

该函数垂直连接两个或多个cv::Mat矩阵(具有相同数量的cols)。

cv::Mat matArray[] = { cv::Mat(1, 4, CV_8UC1, cv::Scalar(1)),
                       cv::Mat(1, 4, CV_8UC1, cv::Scalar(2)),
                       cv::Mat(1, 4, CV_8UC1, cv::Scalar(3)),};
cv::Mat out;
cv::vconcat( matArray, 3, out );
//out:
//[1,   1,   1,   1;
// 2,   2,   2,   2;
// 3,   3,   3,   3]

5.3 其他

cv::borderInterpolate (int p, int len, int borderType)

计算外推像素的源位置。

当使用指定的外推边界模式时,该函数计算并返回与指定外推像素对应的给定像素的坐标。例如,如果您在水平方向使用cv::BORDER_WRAP模式,在垂直方向使用cv::BORDER_REFLECT_101,并且想要计算浮点图像img中的“虚拟”像素点(- 5,100)的值,如下:

float val = img.at(borderInterpolate(100, img.rows, cv::BORDER_REFLECT_101),
                          borderInterpolate(-5, img.cols, cv::BORDER_WRAP));

cv::cartToPolar(InputArray x,InputArray y,OutputArray magnitude,OutputArray angle,bool angleInDegrees = false)

计算二维向量的大小和角度。

参数

x

x坐标数组; 这必须是单精度或双精度浮点数组。

y

y坐标数组,必须与x具有相同的大小和相同的类型。

magnitude

输出与x相同大小和类型的数量的数组。

angle

输出与x具有相同大小和类型的角度数组; 角度以弧度(从0到2 * Pi)或以度(0到360度)测量。

angleInDegrees

一个标志,指示角度是以弧度(默认情况下)或以度为单位测量的。

cv::copyMakeBorder (InputArray src, OutputArray dst, int top, int bottom, int left, int right, int borderType, const Scalar &value=Scalar())

在图像周围形成边框。

该函数将源图像复制到目标图像的中间。复制的源图像的左边、右边、上面和下面的区域将被外推像素填充。这不是基于它的过滤函数所做的(它们动态地推断像素),而是其他更复杂的函数,包括您自己的函数,可能会做什么来简化图像边界处理。

当src已经位于dst中间时,该函数支持该模式。在这种情况下,函数并不复制src本身,而是简单地构造边界,例如:

// 让边框在所有方向都相同
int border=2;
//构造一个更大的图像以适合图像和边框
Mat gray_buf(rgb.rows + border*2, rgb.cols + border*2, rgb.depth());
// 选择它的中间部分没有复制数据
Mat gray(gray_canvas, Rect(border, border, rgb.cols, rgb.rows));
//将图像从RGB转换为灰度
cvtColor(rgb, gray, COLOR_RGB2GRAY);
// 在适当的位置形成一个边框
copyMakeBorder(gray, gray_buf, border, border,
               border, border, BORDER_REPLICATE);
// 现在做一些自定义过滤…
...

cv::countNonZero (InputArray src)

该函数返回src中非零元素的数量

cv::PSNR (InputArray src1, InputArray src2)

计算峰值信噪比(PSNR)图像质量度量。

该函数计算两个输入阵列src1和src2之间的峰值信噪比(PSNR)图像质量度量,单位为分贝(dB)。数组必须有深度CV_8U。

cv::solve (InputArray src1, InputArray src2, OutputArray dst, int flags=DECOMP_LU)

函数cv::solve解决线性系统或最小二乘问题(后者可以使用SVD或QR方法,或者指定标志DECOMP_NORMAL):

cv::solveCubic (InputArray coeffs, OutputArray roots)

求一个三次方程的实根。

cv::solvePoly (InputArray coeffs, OutputArray roots, int maxIters=300)

求多项式方程的实根或复根。

你可能感兴趣的:(Opencv)