图像金字塔与resize函数
圖像金字塔
將一層層圖像比喻成金字塔,層級(jí)越高,圖像越小,分辨率越低。
高斯金字塔:向下降采樣;
拉普拉斯金字塔:向上采樣,通過金字塔低層圖像重建上層未采樣圖像;
金字塔的產(chǎn)生
用高斯核對(duì)圖像進(jìn)行卷積,然后刪除所有偶數(shù)行和偶數(shù)列,新得到的圖形面積為原圖像的1/4,循環(huán)此過程可得到金字塔;
對(duì)圖像向下(圖像尺寸減半)采樣——pyrDown函數(shù);
1、對(duì)圖像進(jìn)行高斯核卷積;
2、刪除所有偶數(shù)行和偶數(shù)列;(逐漸丟失信息)
對(duì)圖像向上(圖像尺寸加倍)采樣——pyrUp函數(shù);
1、對(duì)圖像每個(gè)方向擴(kuò)大原來的兩倍,新增的行列以0填充;
2、使用高斯內(nèi)核(*4)與放大后的圖像卷積;(逐漸丟失信息)
為了減少信息的丟失,使用拉普拉斯金字塔;
拉普拉斯金字塔通過原圖像減去先縮小再放大的圖像構(gòu)成;
API函數(shù)Resize
resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None) —— 將原始圖像調(diào)整為指定大小。
????????scr:原始圖像
????????dsize:輸出圖像的尺寸(元組方式)
????????dst:輸出圖像
????????fx:沿水平軸縮放的比例因子
????????fy:沿垂直軸縮放的比例因子
????????interpolation:插值方法,有以下5種:
cv2.INTER_NEAREST 最近鄰插值
cv2.INTER_LINEAR 雙線性插值(默認(rèn))
cv2.INTER_AREA 使用像素區(qū)域關(guān)系進(jìn)行重采樣。
cv2.INTER_CUBIC 4x4像素鄰域的雙3次插值
cv2.INTER_LANCZOS4 8x8像素鄰域的Lanczos插值
注:如果要縮小圖像,選擇:cv2.INTER_AREA;如果要放大圖像,建議選擇cv2.INTER_LINEAR效果尚可且速度快。進(jìn)行縮放時(shí), dsize和fx、fy 二選一即可。
程序
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;//全局變量
int k = 5;
Mat dst, dst1, dst2;
//載入原圖
Mat src = imread("12.bmp", 1);void on_change(int, void*)
{//resize放縮的兩種用法,二選一即可。resize(src, dst, Size(0, 0), (double)k / 10, (double)k / 10, INTER_AREA);//resize(src, src, Size(src.cols / 2, src.rows / 2),(0,0), (0,0), INTER_AREA);imshow("結(jié)果圖", dst);
}void print()
{cout << "鍵盤按鍵【1】:進(jìn)行resize放縮操作" << endl;cout << "鍵盤按鍵【2】:進(jìn)行pyrUp向上采樣操作" << endl;cout << "鍵盤按鍵【2】:進(jìn)行pyrDown向下采樣操作" << endl;cout << "鍵盤按鍵【Esc】:退出程序" << endl;cout << "注意:放縮值>10為放大,放縮值<10為縮小" << endl;
}int main()
{print();//改變console(控制臺(tái))字體顏色 system("color 0B");//判斷圖片是否讀入if (!src.data){printf("讀取圖片image0錯(cuò)誤~! \n");return false;}//循環(huán)輪詢按鍵while (1){//先顯示原圖namedWindow("原圖");imshow("原圖", src);//獲取鍵盤按鍵int c = waitKey(0);//判斷ESC是否按下,若按下便退出if ((c & 255) == 27){cout << "程序退出!\n";break;}//根據(jù)按鍵的不同,進(jìn)行各種操作switch ((char)c){case '1':cout << "您正在進(jìn)行resize放縮操作" << endl;createTrackbar("resize放縮值", "原圖", &k, 30, on_change);on_change(k, 0);break;case '2':cout << "您正在進(jìn)行pyrUp操作" << endl;pyrUp(src, dst1, Size(src.cols * 2, src.rows * 2));imshow("pyrUp圖", dst1);break;case '3':cout << "您正在進(jìn)行pyrDown操作" << endl;pyrDown(src, dst2, Size(src.cols / 2, src.rows / 2));imshow("pyrDown圖", dst2);break;}}return 0;
}
?
?
總結(jié)
以上是生活随笔為你收集整理的图像金字塔与resize函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像形态学(opencv),运行后通过在
- 下一篇: opencv阈值分割类型