opencv013-影象上取樣和下采樣(+高斯不同)
阿新 • • 發佈:2018-12-16
影象金字塔概念:
1. 我們在影象處理中常常會調整影象大小,最常見的就是放大(zoom in)和縮小(zoom out),儘管幾何變換也可以實現影象放大和縮小,但是這裡我們介紹影象金字塔
2. 一個影象金字塔式一系列的影象組成,最底下一張是影象尺寸最大,最上方的影象尺寸最小,從空間上從上向下看就想一個古代的金字塔。
l高斯金子塔 – 用來對影象進行降取樣
l拉普拉斯金字塔 – 用來重建一張圖片根據它的上層降取樣圖片
影象金字塔概念 – 高斯金字塔:
l高斯金子塔是從底向上,逐層降取樣得到。
l降取樣之後影象大小是原影象MxN的M/2 x N/2 ,就是對原影象刪除偶數行與列,即得到降取樣之後上一層的圖片。
l高斯金子塔的生成過程分為兩步:
- 對當前層進行高斯模糊
- 刪除當前層的偶數行與列
即可得到上一層的影象,這樣上一層跟下一層相比,都只有它的1/4大小。
高斯不同(Difference of Gaussian-DOG):
l定義:就是把同一張影象在不同的引數下做高斯模糊之後的結果相減,得到的輸出影象。稱為高斯不同(DOG)
l高斯不同是影象的內在特徵,在灰度影象增強、角點檢測中經常用到。
取樣相關API:
l上取樣(cv::pyrUp) – zoom in 放大
l降取樣 (cv::pyrDown) – zoom out 縮小
pyrUp(Mat
生成的影象是原圖在寬與高各放大兩倍
pyrDown(Mat src, Mat dst, Size(src.cols/2, src.rows/2))
生成的影象是原圖在寬與高各縮小1/2
#include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; int main(int agrc, char** agrv) { Mat src, dst,gray_src; src = imread("C:/Users/liyangxian/Desktop/bjl/nm3.jpg"); if (!src.data) { printf("no load..\n"); return -1; } const char* input_win = "input"; namedWindow(input_win, CV_WINDOW_AUTOSIZE); imshow(input_win, src); //降取樣 pyrDown(src, dst, Size(src.cols /2, src.rows / 2)); imshow("down_image", dst); //上取樣 Mat up_image; pyrUp(src, up_image, Size(src.cols * 2, src.rows * 2)); imshow("up_image", up_image); //高斯不同 Mat g1, g2,Dog_img; cvtColor(src, gray_src, CV_BGR2GRAY); GaussianBlur(gray_src, g1, Size(5, 5), 0, 0); GaussianBlur(g1, g2, Size(5, 5), 0, 0); subtract(g1, g2,Dog_img,Mat()); //歸一化顯示 normalize(Dog_img, Dog_img, 255, 0, NORM_MINMAX); imshow("dog_img", Dog_img); waitKey(0); return 0; }