文章目录
一、图像缩放resize
1. 概念
resize函数可以将源图像精确地转化为指定尺寸的目标图像。
缩小图像,推荐使用CV_INETR_AREA来插值;
放大图像,推荐使用CV_INTER_LINEAR。
pyrUp, pyrDown其实和专门用作放大缩小图像尺寸的resize在功能上差不多。
另外需要指出的是, pyrUp, pyrDown在OpenCV的imgproc模块中的 Image Filtering子模块里。而resize在imgproc模块的Geometric mage Transformations子模块里。
- 说明
用于改变矩阵的行数. - 声明
void cv::Mat::resize(size_t sz);
2. 调用方式
2.1 规定图片的尺寸
//图片的缩小与放大
int main()
{
Mat img = imread("D:/test/1.jpg");
imshow("原始图", img);
Mat dst = Mat::zeros(512, 512, CV_8UC3); //转化为512*512大小的
resize(img, dst, dst.size());
imshow("尺寸调整之后", dst);
waitKey(0);
return 0;
}
2.2 缩放比率
//图片的缩小与放大
int main()
{
Mat img = imread("D:/test/1.jpg");
imshow("原始图", img);
Mat dst;
resize(img, dst, Size(),0.25,0.25);//长宽都变为img的0.25倍
imshow("尺寸调整之后", dst);
waitKey(0);
return 0;
}
二、图像金字塔
1. 概念
图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效但概念简单的结构。
一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。
说白了就是图像的缩放。
一张图像不断的缩小,大图在下,小图在上,看起来就是一个金字塔。例如下面的苹果:
2. 图像金字塔的原理
2.1 图像的缩小
先进行高斯模糊,再降采样,需要一次次的重复,不能一次到底。
2.2 图像的扩大
先进行图像扩大,在进行卷积或者使用拉普拉斯金字塔
3. 金字塔上采样和下采样
OpenCV中有关图像金字塔的操作有pyrup()和pyrdown(),分别用于完成上采样和下采样。
3.1 下采样pyrDown()
实质就是缩小图像。
pyrDown是一个会丢失信息的函数。
-
说明
模糊一个图像,并下缩小图像尺寸。
通常情况下,输出图像的尺寸由“Size((src.cols+1)/2,(src.rows+1)/2)”计算出。但是无论如何都应满足以下条件:
{ ∣ dstsize.width ∗ 2 − s r c . c o l s ∣ ≤ 2 ∣ dstsize.height ∗ 2 − s r c . r o w s ∣ ≤ 2 \left \{ \begin{array}{l} | \texttt{dstsize.width} *2-src.cols| \leq 2 \\ | \texttt{dstsize.height} *2-src.rows| \leq 2 \end{array} \right. {∣dstsize.width∗2−src.cols∣≤2∣dstsize.height∗2−src.rows∣≤2 -
步骤
- 该函数执行高斯金字塔构造的下采样,先对图像进行高斯内核卷积:
1 256 [ 1 4 6 4 1 4 16 24 16 4 6 24 36 24 6 4 16 24 16 4 1 4 6 4 1 ] \frac{1}{256} \begin{bmatrix} 1 & 4 & 6 & 4 & 1 \\ 4 & 16 & 24 & 16 & 4 \\ 6 & 24 & 36 & 24 & 6 \\ 4 & 16 & 24 & 16 & 4 \\ 1 & 4 & 6 & 4 & 1 \end{bmatrix} 2561⎣⎢⎢⎢⎢⎡1464141624164624362464162416414641⎦⎥⎥⎥⎥⎤
2. 再将所有偶数行和列去除。
- 该函数执行高斯金字塔构造的下采样,先对图像进行高斯内核卷积:
-
声明
void pyrDown( InputArray src, OutputArray dst, const Size& dstsize = Size(), int borderType = BORDER_DEFAULT );
-
参数
src 输入图像 dst 输出图像,它和原图有相同的类型,但是有特定的尺寸。 dstsize 输出图像的尺寸。 borderType 边界填充的类型。BORDER_CONSTANT isn’t supported -
举例
void downSizes(Mat src) { Mat dst; src.copyTo(dst); for ( int i = 0; i <3; i++) { pyrDown(dst, dst); string name = "dst_" + to_string(i); imshow(name, dst); } } int main() { Mat src = imread("D:/test/src.jpg"); imshow("src", src); downSizes(src); waitKey(0); return 0; }
3.2 上采样pyrUp()
实质就是放大图像。
-
说明
下采样图像并模糊它。通常情况下,输出图像的尺寸由Size(src.cols2,src.rows2)计算出来,但是无论如何都应满足以下条件:
{ ∣ dstsize.width − s r c . c o l s ∗ 2 ∣ ≤ ( dstsize.width m o d 2 ) ∣ dstsize.height − s r c . r o w s ∗ 2 ∣ ≤ ( dstsize.height m o d 2 ) } \left \{ \begin{array}{l} | \texttt{dstsize.width} -src.cols*2| \leq ( \texttt{dstsize.width} \mod 2) \\ | \texttt{dstsize.height} -src.rows*2| \leq ( \texttt{dstsize.height} \mod 2) \end{array} \right \} {∣dstsize.width−src.cols∗2∣≤(dstsize.widthmod2)∣dstsize.height−src.rows∗2∣≤(dstsize.heightmod2)}
该函数执行高斯金字塔结构的上采样,尽管实际上可以用于构造拉普拉斯金字塔。 -
步骤:
1.先将图像在每个方向放大为原来的两倍,
2. 新增的行和列用0填充,
3. 将结果与pyrDown中相同的内核乘以4进行卷积,获得新增像素的近似值。 -
声明
void pyrUp( InputArray src, OutputArray dst, const Size& dstsize = Size(), int borderType = BORDER_DEFAULT );
-
参数
src 输入图像 dst 输出图像。它具有指定的大小,并且与src具有相同的类型。 dstsize 指定输出图像的尺寸。 -
举例应用
void upSize(Mat src) { Mat dst = src.clone(); for (int i = 0; i < 3; i++) { pyrUp(dst, dst); string name = "Dst_" + to_string(i); imshow(name, dst); } } int main() { Mat src = imread("D:/test/src912.jpg"); imshow("src", src); upSize(src); waitKey(0); return 0; }
4. 图像金字塔分类
图像金字塔分为两类:高斯图像金字塔和拉普拉斯图像金字塔
4.1 高斯图像金字塔
用于向下采样,主要的图像金字塔。
高斯金字塔通过高斯平滑和亚采样获得一系列下采样图像,也就是第k层高斯金字塔通过平滑、亚采样就可以获得第k+1层高斯图像,高斯金字塔包含一系列低通滤波器,其截至频率从上一层到下一层是以因子2逐渐增加,所以高斯金字塔可以跨越很大的频率范围。
- 高斯金字塔图像:
每一层都按照从下到上的次序编号,层级 G i + 1 G_{i+1} Gi+1(表示为 G i + 1 G_{i+1} Gi+1尺寸小于第i层 G i G_i Gi)。
- 对图像的向下取样
为了获取层级为 G i + 1 G_{i+1} Gi+1的金字塔图像,采用如下方法:
1)对图像 G i G_i Gi进行高斯内核卷积
2)将所有偶数行和列去除
📢📢📢 向下取样会逐渐丢失图像的信息。
4.2 拉普拉斯图像金字塔
用来从金字塔底层图像重建上层采样图像,在数组图像处理中也即是预测残差,可以对图像进行最大程度的还原,配合高斯金字塔一起使用。
拉普拉斯金字塔中的图像可用于对高斯金字塔中相邻的两层图像的相减而近似得到。
需要先将图像在较粗的尺度上扩展。
我们选用的图片大小必须是2^n大小,或者是一个宽高相等的图片
-
对图像的向上取样
-
拉普拉斯应用
Mat src = imread("D:/test/src.jpg"); imshow("src", src); Mat upImg,downImg,dst; pyrDown(src, downImg); pyrUp(downImg, upImg); cout << "src:(" << src.rows << "," << src.cols << ") " << src.channels() << endl; cout << "downImg:(" << downImg.rows << "," << downImg.cols << ") " << downImg.channels() << endl; cout << "upImg:(" << upImg.rows <<","<< upImg.cols << ") " << upImg.channels() << endl; subtract(src, upImg, dst); cout << "dst:(" <<dst.rows << "," <<dst.cols << ") " << dst.channels() << endl; imshow("upimg", upImg); imshow("dst", dst); waitKey(0);
学习:
高斯金字塔、拉普拉斯金字塔
图像金字塔, 高斯金字塔, 拉普拉斯金字塔
Opencv进阶篇—图像金字塔
怎么认识图像金字塔
图像金字塔
OpenCV—图像金字塔原理