一、ROI区域截取
Range(int _start, int _end)
start:区间的起始(包含此范围)。
end:区间的结束(不包含此范围)。
Rect_(_Tp_x,_Tp _y_Tp _width,_Tp _height)
_Tp:数据类型,C++模板特性,可以用int、double、float等替换。
_x:矩形区域左上角第一个像素的x坐标,也就是第一个像素的列数。
_y:矩形区域左上角第一个像素的y坐标,也就是第一个像素的行数。
_width:矩形的宽,单位为像素,即矩形区域跨越的列数。
_height:矩形的高,单位为像素,即矩形区域跨越的行数。
二、图像的深拷贝与浅拷贝
这里的深拷贝和浅拷贝与我们往常提的相同。
深拷贝:
copy To(lnputArray src, OutputArray dst, InputArray mask)
src:待拷贝图像。
dst:深拷贝后的图像。
mask:深拷贝时的掩码矩阵。
copyTo(OutputArray m, lnputArray mask) const
m:深拷贝后的图像。
mask:深拷贝时的掩码矩阵。
二、高斯图像金字塔
上图为高斯图像金字塔。
金字塔下采样接口如下:
pyrDown(InputArray src, outputArray dst, const Size & dstsize = size(), int borderType = BORDER_DEFAULT)
src:输入待下采样的图像。
dst:输出下采样后的图像,图像尺寸可以指定,但是数据类型和通道数与src相同。
dstsize:输出图像尺寸,可以缺省。
borderType:像素边界外推方法的标志。(用什么方法对空余的边界进行填充)
高斯金字塔的使用案例如下:
Mat src = imread("图片1.png");
//定义一个高斯金字塔的向量
vector<Mat> Guess;
//定义高斯金字塔的层数
int level = 3;
//将原图放入到高斯金字塔第一层中
Guess.push_back(src);
//使用for循环对高斯金字塔进行下采样
for (int i = 0; i < 3; i++)
{
//存放下采样之后的金字塔变量
Mat guess;
//取出高斯金字塔前一层的向量,在进行下采样操作
pyrDown(Guess[i], guess);
//下采样之后的图像放入高斯金字塔的向量数据中
Guess.push_back(guess);
}
//循环读取不同层的图像
for (int i = 0; i < 3; i++)
{ //将层数转化为字符串类型
string name = to_string(i);
//显示每一层的数据
imshow(name, Guess[i]);
}
waitKey(0);
return 0;
三、拉普拉斯图像金字塔
pyrUp(lnputArray src, OutputArray dst. const Size & dstsize = size(), int borderType = BORDER_DEFAULT
src:输入待上采样的图像。
dst:输出上采样后的图像,图像尺寸可以指定,但是数据类型和通道数与src相同,
dstsize:输出图像尺寸,可以缺省。
borderType:像素边界外推方法的标志。
样例代码如下:
Mat src = imread("1.jpg");
//定义一个高斯金字塔的向量
vector<Mat> Guess;
//定义高斯金字塔的层数
int level = 3;
//将原图放入到高斯金字塔第一层中
Guess.push_back(src);
//使用for循环对高斯金字塔进行下采样
for (int i = 0; i < level; i++)
{
//存放下采样之后的金字塔变量
Mat guess;
//取出高斯金字塔前一层的向量,在进行下采样操作
pyrDown(Guess[i], guess);
//下采样之后的图像放入高斯金字塔的向量数据中
Guess.push_back(guess);
}
vector<Mat> Lap;
for (int i = Guess.size()-1; i > 0; i--)
{
// //定义每层高斯金字塔的图像、放大后的高斯金字塔图像
Mat lap, upGuess;
//如果读入的图像是高斯金字塔中的最大的图像,则先下采样
if (i == Guess.size() - 1)
{
//对最顶端的图像进行下采样
Mat down;
pyrDown(Guess[i], down);
//在对下采样之后的图像上采样
pyrUp(down, upGuess);
cout << Guess[i].size() << endl;
cout << upGuess.size() << endl;
lap = Guess[i] - upGuess;
// //存入拉普拉斯金字塔的向量中
Lap.push_back(lap);
}
//如果为其他层,则先上采样,在与下一层的特征相减
pyrUp(Guess[i], upGuess);
lap = Guess[i - 1] - upGuess;
//存入拉普拉斯金字塔的向量中
Lap.push_back(lap);
}
//循环读取不同层的图像
for (int i = 0; i < Guess.size(); i++)
{
//将层数转化为字符串类型
string name = to_string(i);
//显示每一层的数据
imshow("G" + name, Guess[i]);
imshow("L" + name, Lap[Guess.size() - 1 - i]);
}