高斯金字塔的思考
来源:互联网 发布:淘宝十周年宣传片 编辑:程序博客网 时间:2024/05/16 04:45
首先,关于理论的部分祭上两个博客,
http://blog.csdn.net/poem_qianmo/article/details/26157633
http://amitapba.blog.163.com/blog/static/203610207201281992239/
感觉说的已经比较详细了,在这里我就不搅舌跟子了。
直接上代码:
#include <iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <boost/concept_check.hpp>using namespace std;using namespace cv;cv::Mat pyrDown(cv::Mat& src);cv::Mat pyrUp(cv::Mat& src);static const double gaussianTemplate[7][7] ={ {0.00000067, 0.00002292, 0.00019117, 0.00038771, 0.00019117, 0.00002292, 0.00000067}, {0.00002292, 0.00078633, 0.00655965, 0.01330373, 0.00655965, 0.00078633, 0.00002292}, {0.00019117, 0.00655965, 0.05472157, 0.11098164, 0.05472157, 0.00655965, 0.00019117}, {0.00038771, 0.01330373, 0.11098164, 0.22508352, 0.11098164, 0.01330373, 0.00038771}, {0.00019117, 0.00655965, 0.05472157, 0.11098164, 0.05472157, 0.00655965, 0.00019117}, {0.00002292, 0.00078633, 0.00655965, 0.01330373, 0.00655965, 0.00078633, 0.00002292}, {0.00000067, 0.00002292, 0.00019117, 0.00038771, 0.00019117, 0.00002292, 0.00000067}};int main(int argc, char **argv) { Mat src = imread("../0.jpg",-1); Mat dst = pyrDown(src); Mat dst1 = pyrUp(dst); imshow("111",src); //cv::waitKey(0); imshow("222",dst); imshow("333",dst1); cv::waitKey(0); return 0;}//向下取样cv::Mat pyrDown(cv::Mat& src){ Mat dst; dst.create(src.size(),src.type()); uchar* srcData = src.data; uchar* dstData = dst.data; //将原始图像进行高斯模糊,高斯卷积过程 for(int j = 0; j < src.cols-7; j++) { for(int i = 0; i < src.rows-7; i++) { double acc = 0; double accb = 0, accg = 0, accr = 0; for(int m = 0; m < 7; m++) {for(int n = 0; n < 7; n++){ if(src.channels() == 1) acc += *(srcData + src.step * (i+n) + src.channels() * (j+m)) * gaussianTemplate[m][n]; else { accb += *(srcData + src.step * (i+n) + src.channels() * (j+m) + 0) * gaussianTemplate[m][n]; accg += *(srcData + src.step * (i+n) + src.channels() * (j+m) + 1) * gaussianTemplate[m][n]; accr += *(srcData + src.step * (i+n) + src.channels() * (j+m) + 2) * gaussianTemplate[m][n]; }} } if(src.channels() == 1) *(dstData + dst.step * (i+3) + dst.channels() * (j+3))=(int)acc; else { *(dstData + dst.step * (i+3) + dst.channels() * (j+3) + 0)=(int)accb; *(dstData + dst.step * (i+3) + dst.channels() * (j+3) + 1)=(int)accg; *(dstData + dst.step * (i+3) + dst.channels() * (j+3) + 2)=(int)accr; }} } //将高斯卷积得到的结果取其奇数行和奇数列 cv::Mat dst1; dst1.create(dst.rows/2,dst.cols/2,dst.type()); uchar* dst1Data = dst1.data; //int m = 0,n = 0; for(int j = 0,n=0; j < dst.rows-7; j = j + 2,n++) {for(int i = 0,m=0; i < dst.cols-7; i = i + 2,m++){ if(dst.channels() == 1)*(dst1Data + dst1.step * n + dst1.channels() * m)=*(dstData + dst.step * j + dst.channels() * i); else {*(dst1Data + dst1.step * n + dst1.channels() * m + 0)=*(dstData + dst.step * j + dst.channels() * i + 0);*(dst1Data + dst1.step * n + dst1.channels() * m + 1)=*(dstData + dst.step * j + dst.channels() * i + 1);*(dst1Data + dst1.step * n + dst1.channels() * m + 2)=*(dstData + dst.step * j + dst.channels() * i + 2); } } } return dst1; }cv::Mat pyrUp(cv::Mat& src){ cv::Mat dst1; dst1.create(src.rows*2,src.cols*2,src.type()); uchar* dst1Data = dst1.data; uchar* srcData = src.data; //int m = 0,n = 0; for(int n=0; n < src.rows; n++) {for(int m=0; m < src.cols; m++){ if(src.channels() == 1) { *(dst1Data + dst1.step * n + dst1.channels() * m) = *(srcData + src.step * n + src.channels() * m); *(dst1Data + dst1.step * n + dst1.channels() * (m+1)) = 0; *(dst1Data + dst1.step * (n+1) + dst1.channels() * m) = 0; *(dst1Data + dst1.step * (n+1) + dst1.channels() * (m+1)) = 0; } else {*(dst1Data + dst1.step * 2 * n + dst1.channels()* 2 * m + 0) = *(srcData + src.step * n + src.channels() * m+ 0);*(dst1Data + dst1.step * 2 * n + dst1.channels() * 2 * (m+1) + 0) = 0;*(dst1Data + dst1.step * 2 * (n+1) + dst1.channels() * 2 * m + 0) = 0;*(dst1Data + dst1.step * 2 * (n+1) + dst1.channels() * 2 * (m+1) + 0) = 0;*(dst1Data + dst1.step * 2 * n + dst1.channels()* 2 * m + 1) = *(srcData + src.step * n + src.channels() * m+ 1);*(dst1Data + dst1.step * 2 * n + dst1.channels() * 2 * (m+1) + 1) = 0;*(dst1Data + dst1.step * 2 * (n+1) + dst1.channels() * 2 * m + 1) = 0;*(dst1Data + dst1.step * 2 * (n+1) + dst1.channels() * 2 * (m+1) + 1) = 0;*(dst1Data + dst1.step * 2 * n + dst1.channels()* 2 * m + 2) = *(srcData + src.step * n + src.channels() * m+ 2);*(dst1Data + dst1.step * 2 * n + dst1.channels() * 2 * (m+1) + 2) = 0;*(dst1Data + dst1.step * 2 * (n+1) + dst1.channels() * 2 * m + 2) = 0;*(dst1Data + dst1.step * 2 * (n+1) + dst1.channels() * 2 * (m+1) + 2) = 0; }} } //cv::imshow("11",dst1); //cv::waitKey(0); Mat dst; dst.create(dst1.size(),dst1.type()); uchar* dstData = dst.data; for(int j = 0; j < dst1.cols - 7; j++) { for(int i = 0; i < dst1.rows - 7; i++) { double acc = 0; double accb = 0, accg = 0, accr = 0; for(int m = 0; m < 7; m++) {for(int n = 0; n < 7; n++){ if(dst1.channels() == 1) acc += *(dst1Data + dst1.step * (i+n) + dst1.channels() * (j+m)) * gaussianTemplate[m][n]*4; else { accb += *(dst1Data + dst1.step * (i+n) + dst1.channels() * (j+m) + 0) * gaussianTemplate[m][n]*4; accg += *(dst1Data + dst1.step * (i+n) + dst1.channels() * (j+m) + 1) * gaussianTemplate[m][n]*4; accr += *(dst1Data + dst1.step * (i+n) + dst1.channels() * (j+m) + 2) * gaussianTemplate[m][n]*4; }} } if(dst1.channels() == 1) *(dstData + dst.step * (i+3) + dst.channels() * (j+3))=(int)acc; else { *(dstData + dst.step * (i+3) + dst.channels() * (j+3) + 0)=(int)accb; *(dstData + dst.step * (i+3) + dst.channels() * (j+3) + 1)=(int)accg; *(dstData + dst.step * (i+3) + dst.channels() * (j+3) + 2)=(int)accr; }} } return dst;}
这段代码主要是实现了高斯金字塔中向下取样算法和向上取样算法。
0 0
- 高斯金字塔的思考
- 高斯金字塔的作用
- 高斯金字塔,拉普拉斯金字塔图像的缩放
- 高斯金字塔与拉普拉斯金字塔的matlab实现
- sift之一:高斯金字塔的构建
- 高斯金字塔的相关基础知识介绍
- 9基于opencv的图像金字塔_高斯金字塔_拉普拉斯金字塔与图片尺寸缩放
- 高斯金字塔·
- 高斯金字塔
- 高斯金字塔
- 【金字塔原理】思考的逻辑
- DOG、Laplacian金字塔&高斯金字塔
- 高斯金字塔和拉普拉斯金字塔理解
- 高斯金字塔与拉普拉斯金字塔
- OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔总结
- 图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
- 高斯金字塔图像分割
- 图像处理------高斯金字塔
- 3128 递归基础之放苹果
- 带赖子的麻将胡牌及其听牌算法研究
- freemaker日期格式化处理
- R语言回归分析
- POJ1611 The Suspects 并查集
- 高斯金字塔的思考
- J2EE:JUnit--Java单元测试框架
- 第四届省赛原题 走迷宫
- Android中Activity的四种启动模式
- 一起Talk Android吧(第十九回:Java常用类之Date)
- Unity 3D
- 从JAVA身边路过,他却没有看我,我也没有抓住
- sql中操作数据累加
- 剑指offer-13.调整数组顺序使奇数位于偶数前面