主要講解
1、resize()函數調用
函數定義:
調用方式:
resize(srcImage, dstImage, Size(64, 128)); //對圖片進行修改
resize(srcImage, dstImage, Size(), 0.5, 0.5);
第6個參數的含義:
INTER_NEAREST:最鄰近插值 (放大好用)
INTER_AREA:區域插值(利用像素區域關係的重採樣插值) (縮小好用)
INTER_CUBIC:三次樣條插值(超過4x4像素鄰域內的雙三次插值)
INTER_LANCZOS4:Lanczos插值(超過8x8像素鄰域的Lanczos插值)
效果展示
將圖像用4種方法先縮小6倍再放大6倍得到的效果:
代碼展示
#include <opencv2/opencv.hpp>
#include <iostream>
#include "windows.h"
#include <stdio.h>
#include "My_ImageProssing_base.h"
using namespace cv;
using namespace std;
/************修改圖片大小示例**********************/
int main()
{
Mat srcImage = imread("D:\\opencv_picture_test\\趣圖景圖\\test12.jpg");//打開原圖
Mat dstImage1, dstImage2, dstImage3, dstImage4; //目標圖
Mat tmpImage = srcImage.clone(); //深複製
imshow("未矯正過的圖像", srcImage);//顯示未矯正的原圖
//由於指定縮放的比例,Size()直接給,後面就分別是x、y方向的縮放比例
resize(tmpImage, dstImage1, Size(), 0.5, 0.5, INTER_NEAREST);
resize(tmpImage, dstImage2, Size(), 0.5, 0.5, INTER_AREA);
resize(tmpImage, dstImage3, Size(), 0.5, 0.5, INTER_CUBIC);
resize(tmpImage, dstImage4, Size(), 0.5, 0.5, INTER_LANCZOS4);
for (int i = 0;i < 5;i++)
{
resize(dstImage1,dstImage1, Size(), 0.5, 0.5, INTER_NEAREST);
resize(dstImage2, dstImage2, Size(), 0.5, 0.5, INTER_AREA);
resize(dstImage3, dstImage3, Size(), 0.5, 0.5, INTER_CUBIC);
resize(dstImage4, dstImage4, Size(), 0.5, 0.5, INTER_LANCZOS4);
}
for (int i = 0;i < 5;i++)
{
resize(dstImage1, dstImage1, Size(), 2, 2, INTER_NEAREST);
resize(dstImage2, dstImage2, Size(), 2, 2, INTER_AREA);
resize(dstImage3, dstImage3, Size(), 2, 2, INTER_CUBIC);
resize(dstImage4, dstImage4, Size(), 2, 2, INTER_LANCZOS4);
}
resize(dstImage1, dstImage1, Size(), 2, 2, INTER_NEAREST);
resize(dstImage2, dstImage2, Size(), 2, 2, INTER_AREA);
resize(dstImage3, dstImage3, Size(), 2, 2, INTER_CUBIC);
resize(dstImage4, dstImage4, Size(), 2, 2, INTER_LANCZOS4);
//resize(srcImage, dstImage, Size(64, 128)); //對圖片進行修改
//resize(input,output,dSize( , ),fx,fy,插值方式);
//INTER_NEAREST:最鄰近插值 (放大好用)
//INTER_AREA:區域插值(利用像素區域關係的重採樣插值) (縮小好用)
//INTER_CUBIC:三次樣條插值(超過4x4像素鄰域內的雙三次插值)
//INTER_LANCZOS4:Lanczos插值(超過8x8像素鄰域的Lanczos插值)
imshow("最鄰近插值", dstImage1);
imshow("區域插值", dstImage2);
imshow("三次樣條插值", dstImage3);
imshow("Lanczos插值", dstImage4);
waitKey(0);
return 0;
}
2、pyrUp()、pyrDown()函數調用
pyrUp()(放大)
函數定義:
第4個參數不用管它。
調用方式:
pyrUp(srcImage,dstImage, Size(srcImage.cols * 2, srcImage.rows * 2));
pyrDown()(縮小)
函數定義:
第4個參數不用管它。
調用方式:
pyrDown(srcImage,dstImage, Size(srcImage.cols / 2, srcImage.rows / 2));
原理講解
1、高斯金字塔
在縮放的過程中難免會造成信息的丟失,爲了彌補信息的丟失,產生了拉普拉斯金字塔
2、拉普拉斯金字塔
(G:Gauss L:Laplace)
運算過程圖解:
離散化的5*5高斯內核: