图像处理之OpenCV - 缩放/旋转/裁剪/加噪声/高斯模糊
@ 缩放
1 void cv::resize ( InputArray src, 2 OutputArray dst, 3 Size dsize, 4 double fx = 0, 5 double fy = 0, 6 int interpolation = INTER_LINEAR 7 )
@ 旋转
1 Mat cv::getAffineTransform ( const Point2f src[], 2 const Point2f dst[] 3 )
根据上图得到src和dst三个点的转换坐标Point2f src[], Point2f dst[];
由getAffineTransform函数得到转换矩阵M;
1 void cv::warpAffine ( InputArray src, 2 OutputArray dst, 3 InputArray M, 4 Size dsize, 5 int flags = INTER_LINEAR, 6 int borderMode = BORDER_CONSTANT, 7 const Scalar &borderValue = Scalar() 8 )
由warpAffine根据上述得到的矩阵M进行稠密仿射转换操作;
@ 裁剪
1 cv::Mat::Mat ( const Mat &m, 2 const Rect &roi 3 )
直接由Mat的构造函数即可得到 Mat m的局部图像;
@ 加噪声
@-@ 步骤
创建噪声Mat: cv::Mat的构造函数;
生成随机数种子:RNG的构造函数;
将随机数填充到噪声Mat中:RNG::fill()函数;
将图像与噪声矩阵相加即可:cv::add()函数;
@-@ 重点函数讲解
1 void cv::RNG::fill ( InputOutputArray mat, 2 int distType, 3 InputArray a, 4 InputArray b, 5 bool saturateRange = false 6 )
函数作用:对矩阵mat填充随机数。
参数:
随机数的产生方式有参数2来决定,如果为参数2的类型为RNG::UNIFORM,则表示产生均匀分布的随机数,如果 为RNG::NORMAL则表示产生高斯分布的随机数。
对应的参数3和参数4为上面两种随机数产生模型的参数。比如说如果随机数产生模型为均匀分布,则参数a表示均匀分布的下限,参数b表示上限。如果随机数产生模型为高斯模型,则参数a表示均值,参数b表示方差。
参数5只有当随机数产生方式为均匀分布时才有效,表示的是是否产生的数据要布满整个范围。
备注:需要注意的是用来保存随机数的矩阵mat可以是多维的,也可以是多通 道的,目前最多只能支持4个通道。
@-@ 核心code
1 cv::Mat img_output(img_input.size(), img_input.type()); 2 cv::Mat noise(img_input.size(), img_input.type()); /**创建一个噪声矩阵*/ 3 cv::RNG rng(time(NULL)); 4 // rng.fill(noise, cv::RNG::UNIFORM, 0, 200); /**均匀分布*/ 5 rng.fill(noise, cv::RNG::NORMAL, 113, 9); /**高斯分布*/ 6 cv::add(img_input, noise, img_output);
@ 高斯滤波
具体操作:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
1 void cv::GaussianBlur ( InputArray src, 2 OutputArray dst, 3 Size ksize, 4 double sigmaX, 5 double sigmaY = 0, 6 int borderType = BORDER_DEFAULT 7 )
功能:对输入的图像src进行高斯滤波后用dst输出;
参数:
ksize为高斯滤波器模板大小-
sigmaX和sigmaY分别为高斯滤波在横向和竖向的滤波系数;(?未理解)
borderTyep为边缘点插值类型;