OPENCV系列博客主要记录自己学习OPENCV的历程,以及存储已经实现的代码,以备后续回顾使用,代码中包含了主要的备注。
一. 图像金字塔概念
概念如下图:最重要的性质是:通过图像金字塔进行上采样或者降采样,图像的特征信息不变。
图像金字塔种类: 包括高斯金字塔(降采样用)和拉普拉斯金字塔(根据图片上层降采样图片,重建一张图片)。
二. 上采样,下采样相关API
三. 实现代码
#include <opencv2/opencv.hpp>
#include <iostream>
#include "math.h"
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
Mat src, dst,dst_2;
//Step1 读取图片
src = imread("E:/OpenCVLearning/Project/source_image/sample.jpg"); //注意斜线方向
if (!src.data) {
cout << "Could not load the image ...." << endl;
return -1;
}
char Original_Win[] = "Original_image";
namedWindow(Original_Win, CV_WINDOW_AUTOSIZE);
imshow(Original_Win, src);
//Step2 上采样
pyrUp(src,dst,Size(src.cols *2,src.rows *2)); //上采样(输入,输出, 行列均2倍)
char Output_Win[] = "pryUP";
namedWindow(Output_Win, CV_WINDOW_AUTOSIZE);
imshow(Output_Win, dst);
//Step3 下采样
// 原理:先高斯模糊->删除偶数行和列
pyrDown(src, dst_2, Size(src.cols * 0.5, src.rows * 0.5));
char Output_Win2[] = "pryDown";
namedWindow(Output_Win2, CV_WINDOW_AUTOSIZE);
imshow(Output_Win2, dst_2);
//Step4 高斯不同(DOG)!!!
//实际上就是: 1.将原图转换为灰度图; 2.对原图高斯模糊1次 为g1 ;3 对g1 高斯模糊为g2; 4 两者相减即是DOG
Mat gray_src, g1, g2;
Mat dog_img; //!!!!DOG结果
cvtColor(src, gray_src,CV_BGR2GRAY);
GaussianBlur(gray_src, g1, Size(3, 3), 0, 0);
GaussianBlur(g1, g2, Size(3, 3), 0, 0);
subtract(g1, g2, dog_img, Mat());
normalize(dog_img, dog_img,255,0,NORM_MINMAX); //!!知识点:归一化: 将两幅图的差别,最大变为255,最小归为0,以便于显示
imshow("DOG",dog_img);
waitKey(0);
return 0;
}
四.效果