画出SIFT高斯金字塔和DOG金字塔

2023-10-14 04:20
文章标签 高斯 sift 金字塔 dog

本文主要是介绍画出SIFT高斯金字塔和DOG金字塔,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://blog.csdn.net/zddblog/article/details/7521424

https://codeload.github.com/gz7seven/image-processing-C---/zip/master

//高斯金字塔
void GaussianPyramid(const Mat &src, vector<Mat>&gauss_pyr, int octaves, int intervals = INTERVALS, double sigma = SIGMA)
{//double *sigmas = new double[intervals+3];double k = pow(2.0, 1.0/intervals);//cout <<"k=" <<k<<endl;sigmas[0] = sigma;
/*for(int i = 1; i < intervals+3; i++){sigmas[i] = k*sigmas[i-1];
//cout << " "<<sigmas[i] ;}
*/double sig_prev, sig_total;for(int i = 1; i < intervals + 3; i++ ){sig_prev = pow( k, i - 1 ) * sigma;sig_total = sig_prev * k;sigmas[i] = sqrt( sig_total * sig_total - sig_prev * sig_prev );}for(int o = 0; o < octaves; o++){//每组多三层for(int i = 0; i < intervals+3; i++){Mat mat;if(o == 0 && i == 0){src.copyTo(mat);}else if(i == 0){//zdd于2012年5月17日修正
//				DownSample(gauss_pyr[o*(intervals+3)-2], mat);  //error//前一组高斯图像的倒数第三层//如图像下标为://0 1 2 3  4  5  //o=0//6 7 8 9 10 11  //o=1//...//第一组第一张图(下标为6)的图像是0组下标为3的图像降采样得来DownSample(gauss_pyr[(o-1)*(intervals+3)+intervals], mat);}else{//每组中下一层由上一层高斯模糊得到GaussianSmooth(gauss_pyr[o * (intervals+3)+i-1], mat, sigmas[i]);}gauss_pyr.push_back(mat);std::stringstream ssTemp1;ssTemp1 << o;std::string strDst1 = ssTemp1.str();std::stringstream ssTemp2;ssTemp2 << i;std::string strDst2 = ssTemp2.str();string save_path = "GaussianPyramid_octaves_" + strDst1 + "_intervals_" + strDst2 + ".jpg";Mat img2;convertScaleAbs(mat, img2, 255, 0);img2.convertTo(img2, CV_8UC1);cvtColor(img2, img2, CV_GRAY2BGR);cv::imwrite(save_path, img2);}}delete[] sigmas;
}
//差分金字塔
void DogPyramid(const Vector<Mat>& gauss_pyr, Vector<Mat>& dog_pyr, int octaves, int intervals=INTERVALS)
{for(int o = 0; o < octaves; o ++){for(int i = 1; i < intervals+3; i++){Mat mat;Sub(gauss_pyr[o*(intervals+3)+i], gauss_pyr[o*(intervals+3)+i-1], mat);dog_pyr.push_back(mat);std::stringstream ssTemp1;ssTemp1 << o;std::string strDst1 = ssTemp1.str();std::stringstream ssTemp2;ssTemp2 << i;std::string strDst2 = ssTemp2.str();string save_path = "DogPyramid_octaves_" + strDst1 + "_intervals_" + strDst2 + ".jpg";Mat img2;convertScaleAbs(mat, img2, 255, 0);img2.convertTo(img2, CV_8UC1);cvtColor(img2, img2, CV_GRAY2BGR);cv::imwrite(save_path, img2);}}
}

 

添加-1层 

# -*- coding: utf-8 -*-
import cv2
import os
import sys
import numpy as npdef searchDirFile(rootDir):garyimglist = []depimglist = []namelist=[]for dir_or_file in os.listdir(rootDir):filePath = os.path.join(rootDir, dir_or_file)# 判断是否为文件if os.path.isfile(filePath):# 如果是文件再判断是否以.jpg结尾,不是则跳过本次循环if os.path.basename(filePath).endswith('.jpg'):if filePath.split('/')[-1].split('_')[0]=="GaussianPyramid":garyimglist.append(filePath)namelist.append(filePath.split('/')[-1].split('.jpg')[0])else:continue# 如果是个dir,则再次调用此函数,传入当前目录,递归处理。elif os.path.isdir(filePath):searchDirFile(filePath)else:print('not file and dir '+os.path.basename(filePath))return garyimglist,namelistocta,inte = 7,6
ImageList = ['']*octa*inte
path = '/home/spple/lena'
garyimglist, namelist = searchDirFile(path)
for key in range(len(namelist)):subname = namelist[key].split('_')octaves = int(subname[2])intervals = int(subname[4])# if (octaves == 0):#     continue# ImageList[(octaves-1)*inte+intervals] = cv2.imread(garyimglist[key])ImageList[(octaves)*inte+intervals] = cv2.imread(garyimglist[key])
vis = np.zeros((ImageList[0].shape[:2][0]*inte,ImageList[0*inte].shape[:2][1]+ImageList[1*inte].shape[:2][1]+ImageList[2*inte].shape[:2][1]+ImageList[3*inte].shape[:2][1]+#ImageList[4*inte].shape[:2][1]+ImageList[5*inte].shape[:2][1]), np.uint8)ImageList[4*inte].shape[:2][1]+ImageList[5*inte].shape[:2][1]+ImageList[6*inte].shape[:2][1]), np.uint8)
shapelist = 0
for cols in range(octa):for rows in range(inte):h,w = ImageList[cols*inte+rows].shape[:2]image = ImageList[cols*inte+rows][:,:,0]vis[h*rows:h*(rows+1), shapelist:w+shapelist] = imageshapelist += w
vis = cv2.cvtColor(vis, cv2.COLOR_GRAY2BGR)
cv2.imwrite("./all.jpg", vis)

 

不添加-1层  

# -*- coding: utf-8 -*-
import cv2
import os
import sys
import numpy as npdef searchDirFile(rootDir):garyimglist = []depimglist = []namelist=[]for dir_or_file in os.listdir(rootDir):filePath = os.path.join(rootDir, dir_or_file)# 判断是否为文件if os.path.isfile(filePath):# 如果是文件再判断是否以.jpg结尾,不是则跳过本次循环if os.path.basename(filePath).endswith('.jpg'):if filePath.split('/')[-1].split('_')[0]=="GaussianPyramid":garyimglist.append(filePath)namelist.append(filePath.split('/')[-1].split('.jpg')[0])else:continue# 如果是个dir,则再次调用此函数,传入当前目录,递归处理。elif os.path.isdir(filePath):searchDirFile(filePath)else:print('not file and dir '+os.path.basename(filePath))return garyimglist,namelistocta,inte = 6,6
ImageList = ['']*octa*inte
path = '/home/spple/lena'
garyimglist, namelist = searchDirFile(path)
for key in range(len(namelist)):subname = namelist[key].split('_')octaves = int(subname[2])intervals = int(subname[4])if (octaves == 0):continueImageList[(octaves-1)*inte+intervals] = cv2.imread(garyimglist[key])
vis = np.zeros((ImageList[0].shape[:2][0]*inte,ImageList[0*inte].shape[:2][1]+ImageList[1*inte].shape[:2][1]+ImageList[2*inte].shape[:2][1]+ImageList[3*inte].shape[:2][1]+ImageList[4*inte].shape[:2][1]+ImageList[5*inte].shape[:2][1]), np.uint8)
shapelist = 0
for cols in range(octa):for rows in range(inte):h,w = ImageList[cols*inte+rows].shape[:2]image = ImageList[cols*inte+rows][:,:,0]vis[h*rows:h*(rows+1), shapelist:w+shapelist] = imageshapelist += w
vis = cv2.cvtColor(vis, cv2.COLOR_GRAY2BGR)
cv2.imwrite("./all_1.jpg", vis)

 

DOG:不添加-1层:

这篇关于画出SIFT高斯金字塔和DOG金字塔的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/208104

相关文章

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【机器学习】高斯网络的基本概念和应用领域

引言 高斯网络(Gaussian Network)通常指的是一个概率图模型,其中所有的随机变量(或节点)都遵循高斯分布 文章目录 引言一、高斯网络(Gaussian Network)1.1 高斯过程(Gaussian Process)1.2 高斯混合模型(Gaussian Mixture Model)1.3 应用1.4 总结 二、高斯网络的应用2.1 机器学习2.2 统计学2.3

高斯平面直角坐标讲解,以及地理坐标转换高斯平面直角坐标

高斯平面直角坐标系(Gauss-Krüger 坐标系)是基于 高斯-克吕格投影 的一种常见的平面坐标系统,主要用于地理信息系统 (GIS)、测绘和工程等领域。该坐标系将地球表面的经纬度(地理坐标)通过一种投影方式转换为平面直角坐标,以便在二维平面中进行距离、面积和角度的计算。 一 投影原理 高斯平面直角坐标系使用的是 高斯-克吕格投影(Gauss-Krüger Projection),这是 横

高斯混合模型(GMM)的EM算法实现

在 聚类算法K-Means, K-Medoids, GMM, Spectral clustering,Ncut一文中我们给出了GMM算法的基本模型与似然函数,在EM算法原理中对EM算法的实现与收敛性证明进行了详细说明。本文主要针对如何用EM算法在混合高斯模型下进行聚类进行代码上的分析说明。 GMM模型: 每个 GMM 由 K 个 Gaussian 分布组成,每个 Gaussian 称为一个“C

【matlab】仿真4PSK调制信号在高斯信道下的性能,并与理论分析结果比较——仿真篇

三、4PSK调制信号在高斯信道下的性能仿真[--详细解析--] 1. MATLAB进行仿真程序如下: %{----------------------------------------------------------------------------- File: 说明文件

【matlab】仿真4PSK调制信号在高斯信道下的性能,并与理论分析结果比较——理论篇

1.     试编写程序,仿真4PSK调制信号在高斯信道下的性能,并与理论分析结果比较。   一、4PSK调制信号在高斯信道下的性能仿真 仿真4PSK的调制以及解调的仿真图,包括已调信号的波形,解调后的信号波形,眼图和误码率。 在仿真的基础上分析比较了各种调制方法的性能,并比较仿真模型与理论性能,证明了仿真模型是否有效。 目前,改进的数字调制方式主要有偏置正交相移键控,π/4正交差分相移

以人口金字塔图为例,在线绘制左右双侧堆叠条形图

导读: 人口金字塔(population pyramids)用于展示一个特定人口的年龄和性别分布。本质上是一种水平条形图。左侧是男性的数据,右侧是女性的数据。 Proc Natl Acad Sci U S A.文章《Demographic change and assimilation in the early 21st-century United States》fig 1的人口金字

机器学习项目——基于机器学习(RNN LSTM 高斯拟合 MLP)的锂离子电池剩余寿命预测方法研究(代码/论文)

完整的论文代码见文章末尾 以下为核心内容和部分结果 摘要 机器学习方法在电池寿命预测中的应用主要包括监督学习、无监督学习和强化学习等。监督学习方法通过构建回归模型或分类模型,直接预测电池的剩余寿命或健康状态。无监督学习方法则通过聚类分析和降维技术,识别电池数据中的潜在模式和特征。强化学习方法通过构建动态决策模型,在电池运行过程中不断优化预测策略和调整参数。上述方法不仅可以提高预测精度,还可以在

平均场变分推断:以混合高斯模型为例

文章目录 一、贝叶斯推断的工作流二、一个业务例子三、变分推断四、平均场理论五、业务CASE的平均场变分推断求解六、代码实现 一、贝叶斯推断的工作流 在贝叶斯推断方法中,工作流可以总结为: 根据观察者的知识,做出合理假设,假设数据是如何被生成的将数据的生成模型转化为数学模型根据数据通过数学方法,求解模型参数对新的数据做出预测 在整个pipeline中,第1点数据的生成过程

高斯模糊实现小结

转自:http://blog.csdn.net/zddblog/article/details/7450033 高斯模糊是一种图像滤波器,它使用正态分布(高斯函数)计算模糊模板,并使用该模板与原图像做卷积运算,达到模糊图像的目的。 N维空间正态分布方程为: 其中,σ是正态分布的标准差,σ值越大,图像越模糊(平滑)。r为模糊半径,模糊半径是指模板元素到模板中心的距离。如二维模板