1. 程式人生 > >opencv013-影象上取樣和下采樣(+高斯不同)

opencv013-影象上取樣和下采樣(+高斯不同)

影象金字塔概念:

1. 我們在影象處理中常常會調整影象大小,最常見的就是放大(zoom in)和縮小(zoom out),儘管幾何變換也可以實現影象放大和縮小,但是這裡我們介紹影象金字塔

2. 一個影象金字塔式一系列的影象組成,最底下一張是影象尺寸最大,最上方的影象尺寸最小,從空間上從上向下看就想一個古代的金字塔。

l高斯金子塔 用來對影象進行降取樣

l拉普拉斯金字塔 用來重建一張圖片根據它的上層降取樣圖片

影象金字塔概念 高斯金字塔:

l高斯金子塔是從底向上,逐層降取樣得到。

l降取樣之後影象大小是原影象MxNM/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

src, Mat dst, Size(src.cols*2, src.rows*2))

生成的影象是原圖在寬與高各放大兩倍

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;
}