OpenCV中的图像金字塔(高斯金字塔、拉普拉斯金字塔)

article/2025/8/15 4:18:04

      最近在看关于数字图像的知识点,目前在图像金字塔部分,实在是懒得用手作笔记了,就以其中比较出名的“高斯金字塔”和“拉普拉斯金字塔”为例,基于OpenCV的源代码作解析存个档;毕竟属于基础部分,以后有需要就当接口调用吧;有写的不对需要改正的地方,还请大家指出,谢谢。

一、金字塔

1.何为图像金字塔?

      图像金字塔是图像中多尺度表达形式的之一,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。图像金字塔最初用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状从低(下)到高(上)排列的,分辨率逐步降低的图像集合。

具体以下示例图和流程图: 

图像金字塔分层                                                                                                            模板金字塔流程图

2.何为高斯金字塔?

      高斯金字塔顾名思义,基于模板金字塔的构建的方式引入指定的低通高斯滤波(空间域)并结合下采样的迭代方式进行层次之间的计算;(高斯金字塔底部是第0级)

      而拉普拉斯金字塔恰好与高斯金字塔相反,拉普拉斯金字塔依赖于高斯金字塔构建的图层;当高斯金字塔形成之时,我们需要对高斯金字塔的每一层进行上采样,形成该图层对应的近似预测图像,求去它们之间的差值,得到就是拉普拉斯金字塔该层次的图像;也就是说,高斯金字塔由下至上构建,而拉普拉斯金字塔又上至下构建(高斯金塔要比拉普拉斯金字塔多构建一次,用于顶层差值求取);得到的拉普拉斯金字塔起到预测残差的作用。

具体以下示例图和流程图:

高斯金字塔                                                                                   高斯金字塔和拉普拉斯金字塔流程图

二、金字塔构建流程

1. 高斯金字塔的构建

  1. 将原始图像与低通高斯滤波矩阵做卷积处理
  2. 利用基数为2的下采样(删除偶数行和偶数列)得到维数减半的上一级图像

1.1 低通高斯滤波

      "滤波"一词借用于频率域处理,"滤波"是指接受(通过)或拒绝一定的频率的成分。低频的滤波器成为低通滤波器,其最终的效果是模糊(平滑)一幅图像。

      数值图像处理中,低通高斯滤波可以以不同的形式作用于空间域(线性)和频率域。第一种是属于空间滤波器(也被称为高斯模板、高斯核、高斯掩模、高斯窗口),第二种方法是通过傅里叶变换后进行操作。本文涉及到的是第一种平滑空间滤波器。

      常用的平滑线性空间滤波器有均值滤波以及高斯滤波等。均值滤波使用模板内所有像素的平均值代替模板中心像素灰度值,这种方法易收到噪声的干扰,不能完全消除噪声,只能相对减弱噪声,且存在着不希望有的边缘模糊负面效应;为了减少平滑处理中的模糊效应,得到更加自然的平滑效果,需要适当加大模板中心点的权重;随着距离中心点的距离来增减控制权重占比大小,基于这样的考虑形成的模板即为高斯模板。

       常用的高斯模板核通常是3×3,5×5的奇数矩阵,根据OpenCV提供的代码为例,采用5×5的模板如下(令右侧矩阵为M,左侧为归一化系数1/\sum M(i,j)):

 kernel=\frac{1}{256}\begin{bmatrix} 1 & 4 & 6 & 4 & 1\\ 4& 16& 24 & 16& 4\\ 6& 24 &36 & 24 & 6\\ 4& 16& 24 & 16& 4 \\ 1 & 4 & 6 & 4 & 1 \end{bmatrix}_{5\times 5}

      该高斯模板核矩阵中的参数是通过二维高斯函数,即二维正态分布密度函数求得的,回忆一下(由一维延伸到二维),具体如下。

一维高斯函数,形式如下:

一维高斯函数

二维高斯函数,形式如下:

二维高斯函数(均值u=0)

1.2 高斯模板的实现

      高斯模板正是将连续的二维高斯函数的离散化表示,因此任意大小的高斯模板都可以通过建立一个(2k+1)*(2k+1)的矩阵M(m×n),得到其(i,j)位置的参数可如下确定:

M(i,j)=\frac{1}{2\pi \sigma ^{2}}\exp (-\frac{(i-k-1)^{2}+(j-k-1)^{2}}{2\sigma ^{2}})     

      此公式基于Matlab的实现,因此i和j的起始为1非0(数组索引必须为正整数或逻辑值);基于VS的实现,i和j的起始为0(不要带入-1的参数);k为每个方向距离该方向中心的距离,即k=\frac{m-1}{2}=\frac{n-1}{2}

获取OpenCV中smooth.dispatch.cpp的getGaussianKernel函数的源码:

Mat getGaussianKernel(int n, double sigma, int ktype)
{CV_Assert(n > 0);const int SMALL_GAUSSIAN_SIZE = 7;static const float small_gaussian_tab[][SMALL_GAUSSIAN_SIZE] ={{1.f},                                                                     //1×1{0.25f, 0.5f, 0.25f},                                                      //3×3{0.0625f, 0.25f, 0.375f, 0.25f, 0.0625f},                                  //5×5{0.03125f, 0.109375f, 0.21875f, 0.28125f, 0.21875f, 0.109375f, 0.03125f}   //7×7};const float* fixed_kernel = n % 2 == 1 && n <= SMALL_GAUSSIAN_SIZE && sigma <= 0 ?small_gaussian_tab[n>>1] : 0;CV_Assert( ktype == CV_32F || ktype == CV_64F );Mat kernel(n, 1, ktype);float* cf = kernel.ptr<float>();double* cd = kernel.ptr<double>();double sigmaX = sigma > 0 ? sigma : ((n-1)*0.5 - 1)*0.3 + 0.8;double scale2X = -0.5/(sigmaX*sigmaX);double sum = 0;int i;for( i = 0; i < n; i++ ){double x = i - (n-1)*0.5;double t = fixed_kernel ? (double)fixed_kernel[i] : std::exp(scale2X*x*x);if( ktype == CV_32F ){cf[i] = (float)t;sum += cf[i];}else{cd[i] = t;sum += cd[i];}}CV_DbgAssert(fabs(sum) > 0);sum = 1./sum;for( i = 0; i < n; i++ )                            //归一化{if( ktype == CV_32F )cf[i] = (float)(cf[i]*sum);elsecd[i] *= sum;}return kernel;
}

代码实现矩阵:

#include<opencv2/opencv.hpp>
#include<iostream>using namespace cv;
using namespace std;int main()
{Mat g, g1, g2;g= getGaussianKernel(5, 0, CV_32F);    //size,sigma,typeg1 = g * g.t();                        //g * g的转置得到二维高斯卷积核cout << g1 << endl;g2 = g * g.t() * 256;                  //归一化右侧整数矩阵cout << g2 << endl;cin.get();return 0;
}

计算出来的高斯模板参数为:

高斯模板矩阵和矩阵M
  • 当第二个参数sigma的取值为0时,getGaussianKernel函数中已经指定了1,3,5,7这四个模板的参数,为的是调用常用模板取固定整型参数,去除小数点也方便运算;
  • 当第二个参数sigma的取值不为0时,getGaussianKernel函数将按照指定sigma值代入下两行代码运算: 
double x = i - (n-1)*0.5;          //相当于式中 i-k=i-(n-1)/2
double t = fixed_kernel ? (double)fixed_kernel[i] : std::exp(scale2X*x*x);  

上两行代码对应了上述二维高斯函数(不带参数-1)的实现,其中滤去了系数1/2 \pi \sigma ^{2},是因为在下面代码作归一化处理时,可以消除该权重,因此可以省去加快计算速度。

获取Matlab中的fspecial函数:

 filter=fspecial('gaussian',5,0.5);    //mood,size,sigma
取sigma=0.5

*关于标准差\sigma(sigma)的取值和归一化处理做个两个注释:

1. 标准差\sigma(sigma)

      当标准差\sigma取不同的值时,二维高斯函数的形状会有很大的变化:如果标准差\sigma选择过小,偏离中心的所有像素的权重将会非常小,相当于加权和影响基本不考虑邻域像素的作用,这样滤波操作退化为图像的点运算,无法起到平滑噪声的作用;相反如果标准差\sigma选择过大,而邻域相对较小,这样在邻域内高斯模板将会退化为平均模板;因此在实际应用中选择合适的标准差\sigma非常重要。

取sigma=0.5                                                                                                                                                 取sigma=5

 2.归一化

       不难看出,在矩阵核的左边存在一个系数,它是归一化的象征1/\sum M(i,j);归一化的目的:对灰度级为常数的图像区域,高斯模板的响应和必须为1。若小于1,像素值发生偏移,产生了误差,邻域像素之间的差值将减小;若大于1,存在超过像素上限(255)的可能,形成局部亮度。因此要对初始形成的模板进项归一化处理,且也存在提高整体像素精度的作用。


 2.1 图像卷积

      我们依然采用延伸的思维从一维过渡到二维图像卷积,先来看下连续信号的卷积:

 1.连续信号的卷积

      对于任意波形的信号x(t)都可以分割成许多相邻的矩阵脉冲,\Delta代表了脉冲的宽度,对于t=n\Delta时刻的矩形脉冲,其高度即x(t)的值为x(n\Delta )

用窄脉冲之和近似表示任意信号                                                                                            门函数以及高度(强度)为1的门函数

      无穷多个矩形脉冲的叠加可用来近似原信号x(t),即

x(t)\approx \sum_{n=-\infty }^{\infty }x(n\Delta )g_{\Delta }(t-n\Delta )\Delta

      显然,当脉冲宽度越窄,近似程度就越高,就越逼近原信号x(t)(类似于高数中的经典积分思想);当\Delta \rightarrow 0极限的情况下,高度在上升,但面积始终保持为1,因此们函数可表示为由强度形式表达的单位冲激函数\delta (t),上式变换为

x(t)=\lim_{\Delta \rightarrow 0}\sum_{n=-\infty }^{\infty }x(n\Delta )\delta (t-n\Delta )\Delta

      我们用d\tau表示\Delta\tau表示n\Delta,求和变成连续新变量\tau的卷积积分

x(t)=\int_{-\infty }^{\infty }x(\tau )\delta (t-\tau )d\tau

  • 表明任意波形的信号x(t)可以表示为无限多个强度为x(\tau )d\tau的单位冲激信号[x(\tau )d\tau]\delta (t-\tau)的积分
  • 表明任意波形的信号x(t)都可以分解为连续的加权(延迟)单位冲激信号之和
  • 对于连续信号而言,卷积是一种特殊的积分运算,它的整个过程就是一个函数固定不动,另一个函数先以y轴为对称轴翻转,然后不断执行相乘,积分

 2.离散信号的卷积

       离散时间信号是连续时间信号经过离散化(即取样)的结果,即连续卷积积分离散化为

x(k)=\sum_{n=-\infty }^{\infty }x(n)\delta (k-n)=x(k)\ast h(k)

  • 表明任一离散信号x(k)均可表示为单位函数\delta (k)的延时加权和的形式

      根据线性时不变系统的零状态响应叠加性和时不变性,则离散系统对x(n)\delta (k-n)零状态响应为x(n)h(k-n),把得到的零状态响应称为卷积和或离散卷积,记为

x(k)=\sum_{n=-\infty }^{\infty }x(n)h(k-n)=x(k)\ast h(k)

  • 对于上式离散信号求卷积和而言,它的整个过程就是一个一维序列点集合和另一个一维序列点集合反向(翻转)对应乘积的和
  • 在此基础之上,拓展到二维(有限范围k内),便有了二维离散卷积,即图像卷积g(x,y)=\sum_{m=-k}^{k}\sum_{n=-k}^{k}w(m,n)f(x-m,y-n)=w(x,y)\ast f(x,y)

3.图像卷积

      在执行线性空间滤波时,存在两个近似的概念:一个是"相关",另一个是"卷积"。

  • "相关"是滤波器模板移过图像并计算每个位置乘积之和的处理
  • "卷积"是模板先旋转180°,再将滤波器模板移过图像并计算每个位置乘积之和的处理

      "卷积"的基本特性是x(k)与单位函数\delta (k)的卷积和仍然是x(k)本身,即

x(k)=x(k)\ast \delta (k)

      基于以上这一点,我们延伸到二维图像中作卷积(mode:same),我们令模板与同模板尺寸大小,除中心点像素点为1,其余点为0的矩阵进行"相关"运算,得到的结果是在中心点位产生该模板的一个旋转180°的版本。因此,如果我们预先旋转模板,并执行相同的滑动乘积求和的操作,就能得到希望的结果(中心点为模版矩阵),也契合公式的求取。但如果滤波器模板是对称的,那么作"相关"和"卷积"运算将得到相同的结果,高斯模板正是如此。 

图像卷积公式和图像卷积运算(same mode)

      我们也可以从另一个角度举例说明,图像卷积的模板需要先旋转180°;将二维卷积公式展开代入求取特定的值g(0,0),有

 g(0,0)=w(1,1)f(-1,-1)+w(1,0)f(-1,0)+w(1,-1)f(-1,1)+...+w(-1,-1)f(1,1)

原图像坐标和未旋转的3×3的模板坐标

       通过展开式和上图明显能看出要想实现滑动乘积求和,要先将模板w旋转180°即可;对于超出原图像边界的像素值默认赋0。


3.1 下采样

       下采样用于减半计算得到的近似及上一层空间维数的图像,下采样操作可视为删除偶数行和偶数列的像素点,赋给新的矩阵序列

       根据OpenCV官方提供的代码,pyrDown()函数专门用于图像的下采样计算(包含了高斯模糊的卷积运算,模板参数大小默认为5×5的):

pyrDown()函数原型
1.  void cv::pyrDown(InputArray src,                       //待下采样的图像 
2.                   OutputArray dst,                      //输出下采样后的图像
3.                   const Size & dstsize = Size(),        //输出图像尺寸(限制),默认是N/2
4.                   int borderType = BORDER_DEFAULT)      //像素边界外推方式,默认即可

      至此,我们反复的迭代计算(一般金字塔4~5层),便形成了高斯金字塔(具体图片与拉普拉斯金字塔一并给出)。


2. 拉普拉斯金字塔的构建

  1. 利用基数为2的上采样(在偶数行和偶数列补0)作用在高斯N+1级图像上(尺寸与N级高斯图像一致)
  2. 对上采样后图像进行高斯模糊(高斯模板核*4)
  3. 将模糊后的图像与原N级高斯图像作差值运算,得到第N级的拉普拉斯图像

2.1 上采样

      上采样用于翻倍计算得到的近似同下一层空间维数的图像,下采样操作可视为在偶数行和偶数列的像素值赋0(与下采样形成互补操作),赋给新的矩阵序列

      根据OpenCV官方提供的代码,pyrUp()函数专门用于图像的上采样计算(包含了高斯模糊的卷积运算,5×5的模板参数*4):

pyrUp()函数原型
1.  void cv::pyrUp(InputArray src,                       //待上采样的图像 
2.                 OutputArray dst,                      //输出上采样后的图像
3.                 const Size & dstsize = Size(),        //输出图像尺寸(限制),默认是N*2
4.                 int borderType = BORDER_DEFAULT)      //像素边界外推方式,默认即可

      至此,我们反复的迭代计算,记得作减法运算,便形成了拉普拉斯金字塔。 


*关于模板核*4和模板插值滤波器做个两个注释:       

 1.模板核*4

      对于上采样后需要模糊的高斯模板核*4,很多博主都没详细说明,我的理解是:符合归一化。采用5×5的模板参数落在对应的像素点上,其中存在大量赋值为0的像素点(这些点的权重相当于不作用),无论是对应原矩阵中奇0偶数、偶0奇数、奇数偶0、偶数奇0,非0像素点对应的权重和一定满足\sum M(i,j)=64,所以将原有归一化系数*4=1/64,满足归一化的作用。

2.模板插值滤波器

      对于内插滤波器,常用的包括最邻近插值法、双线性插值法、双三次插值法,其效果也是呈明显的递增,消除了锯齿特征也保留了图像的细节,毕竟拟合的点数增多了随之而来的是计算时间也增加了;在OpenCV大部分内嵌插值法的函数中和商业用途中多采用双线性插值法,这也是在计算时间和质量之间寻求到的不错的折中选择。

3种插值法示意图

      最后,给出高斯金字塔和拉普拉斯金字塔作为完结(附上最经典的Lena图吧,哈哈哈)。

高斯金字塔
拉普拉斯金字塔


三、金字塔实现代码

      略(●'◡'●)


参考文献:

1.https://www.cnblogs.com/shine-lee/p/9671253.html

2.https://blog.csdn.net/naruhina/article/details/104729037/

3.数字图像处理(冈萨雷斯)

4.数字图像处理和机器视觉(Visual C++与Matlab实现)


http://chatgpt.dhexx.cn/article/yas8fsgJ.shtml

相关文章

python 高斯金字塔_Python OpenCV 之图像金字塔,高斯金字塔与拉普拉斯金字塔

Python OpenCV 365 天学习计划&#xff0c;与橡皮擦一起进入图像领域吧。 基础知识铺垫 学习图像金字塔&#xff0c;发现网上的资料比较多&#xff0c;检索起来比较轻松。 图像金字塔是一张图像多尺度的表达&#xff0c;或者可以理解成一张图像不同分辨率展示。 金字塔越底层的…

图像金字塔和高斯金字塔

一&#xff1a;图像金字塔 图像金字塔是图像中多尺度表达的一种&#xff0c;最主要用于图像的分割&#xff0c;是一种以多分辨率来解释图像的有效但概念简单的结构。图像金字塔实际上是一张图片在不同尺度下的集合&#xff0c;即原图的上采样和下采样集合。金字塔的底部是高分辨…

opencv学习-高斯金字塔和拉普拉斯金字塔

图像金字塔 一个图像金字塔是由一系列的图像组成&#xff0c;最底下一张是图像尺寸最大&#xff0c;最上方的图像尺寸最小&#xff0c;从空间上从上向下看就像一个古代的金字塔。金字塔的底部是待处理图像的高分辨率表示&#xff0c;而顶部是低分辨率的近似。我们将一层一层的…

高斯金字塔与拉普拉斯金字塔的原理与python构建

转载自:https://zhuanlan.zhihu.com/p/94014493 高斯金字塔和拉普拉斯金字塔【1】在图像相关领域应用广泛&#xff0c;尤其是图像融合和图像分割方面。本文从理论和opencv实现两个方面对两种金字塔进行了介绍&#xff0c;并给出了二者的视觉效果。 1、高斯金字塔 在计算机视觉…

图像金字塔、高斯金字塔、拉普拉斯金字塔是怎么回事?附利用拉普拉斯金字塔和高斯金字塔重构原图的Python-OpenCV代码

图像金字塔是对图像进行多分辨率表示的一种有效且简单的结构。 一个图像金字塔是一系列以金字塔形状排列的分辨率逐步降低的图像。图像金字塔的底部是待处理图像的高分辨率表示&#xff0c;而顶部是低分辨率表示。 图像金字塔有什么作用&#xff1f; 图像金字塔常用于图像缩放…

高斯金字塔

1、为什么要构建高斯金字塔 高斯金字塔模仿的是图像的不同的尺度&#xff0c;尺度应该怎样理解&#xff1f;对于一副图像&#xff0c;你近距离观察图像&#xff0c;与你在一米之外观察&#xff0c;看到的图像效果是不同的&#xff0c;前者比较清晰&#xff0c;后者比较模糊&am…

系统集成项目管理工程师知识点

信息化知识 在这个学时里&#xff0c;将学习有关信息化的许多知识点&#xff0c;这些知识点的试题大多出现在上午试 题中。这引起知识点主要是&#xff1a; &#xff08;1&#xff09;信息与信息化的定义。 &#xff08;2&#xff09;国家信息化发展战略&#xff08;2006-2020&…

快速了解Scala技术栈

http://www.infoq.com/cn/articles/scala-technology/ 我无可救药地成为了Scala的超级粉丝。在我使用Scala开发项目以及编写框架后&#xff0c;它就仿佛凝聚成为一个巨大的黑洞&#xff0c;吸引力使我不得不飞向它&#xff0c;以至于开始背离Java。固然Java 8为Java阵营增添了一…

一篇博客带你掌握pytorch基础,学以致用(包括张量创建,索引,切片,计算,Variable对象的创建,和梯度求解,再到激活函数的使用,神经网络的搭建、训练、优化、测试)

一篇博客带你掌握pytorch基础&#xff0c;学以致用 1.将numpy的 ndarray对象转换为pytorch的张量 在 Pytroch 中&#xff0c;Tensor 是一种包含单一数据类型元素的多维矩阵&#xff0c;译作张量。熟悉 numpy 的同学对这个定义应该感到很熟悉&#xff0c;就像ndarray一样&…

AI题目整理

文章目录 1、网络配置时batchsize的大小怎样设置?过小和过大分别有什么特点?2、设置学习率衰减的原因?3、有哪些分类算法?4、分类和回归的区别?5、请描述一下K-means聚类的过程?6、训练集、测试集、验证集的作用?7、请讲解一下k折交叉验证?8、分类和聚类的区别?9、讲述…

【深度学习】对迁移学习中域适应的理解和3种技术的介绍

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 1 『如何理解域适应』 域适应是计算机视觉的一个领域&#xff0c;我们的目标是在源数据集上训练一个神经网络&#xff0c;并确保在显著不同于源数据集的目标数据集上也有…

协议模糊的堆叠式Seq2seq注意模型

摘要--通过生成大量异常数据作为程序的输入&#xff0c;模糊测试是发现软件漏洞的有效方法。很难自动模糊协议&#xff0c;因为必须手动构造一个满足协议规范的模板以生成测试用例。在本文中&#xff0c;我们建立了堆叠的seq2seq注意模型来自动生成协议测试用例。Seq2seq-atten…

【推荐收藏】3.5万字图解Pandas

文章目录 第一部分&#xff1a;Pandas 展示技术提升1. 排序2.按多列排序3. 添加一列4. 快速元素搜索5. 按列连接&#xff08;join&#xff09;6.按列分组7. 数据透视表8、Pandas速度 第二部分. Series 和 Index索引(Index)按值查找元素缺失值比较追加、插入、删除统计数据重复数…

层次分析法原理及应用案例

层次分析法是指将一个复杂的多目标决策问题作为一个系统&#xff0c;将目标分解为多个目标或准则&#xff0c;进而分解为多指标&#xff08;或准则、约束&#xff09;的若干层次&#xff0c;通过定性指标模糊量化方法算出层次单排序&#xff08;权数&#xff09;和总排序&#…

论文研读-AI4VIS-可视化推荐-VizML: 一种基于机器学习的可视化推荐方法

VizML: 一种基于机器学习的可视化推荐方法 1 论文概述1.1 摘要1.2 引言 2 问题陈述3 相关工作3.1 基于规则的可视化推荐系统3.2 基于机器学习的可视化推荐系统 4 数据4.1 Plotly介绍4.2 数据描述和分析&#xff0c;收集和清理4.2 数据特征提取4.3 设计选择提取 5 方法5.1 特征处…

《python数据分析与挖掘实战》笔记第3章

文章目录 第3章&#xff1a;数据探索3.1、数据质量分析3.2、数据特征分析3.2.1、分布分析3.2.2、对比分析3.2.3、统计量分析1.集中趋势度量2.离中趋势度量 3.2.4、周期性分析3.2.5、贡献度分析3.2.6、相关性分析1. 直接绘制散点图2. 绘制散点图矩阵3. 计算相关系数 3.3、python…

对迁移学习中域适应的理解和3种技术的介绍

域适应是计算机视觉的一个领域&#xff0c;我们的目标是在源数据集上训练一个神经网络&#xff0c;并确保在显著不同于源数据集的目标数据集上也有良好的准确性。为了更好地理解域适应和它的应用&#xff0c;让我们先看看它的一些用例。 我们有很多不同用途的标准数据集&#…

基于1305变频器的几种变参数运行测试

该文主要用于学习归纳&#xff0c;因此会省略正规操作中很多步骤&#xff0c;详述原理。欢迎指正。 一. 设备参数 1305变频器一台(380-460V/9A/4.0KW/5HP)&#xff1b;三相异步交流电动机(1.5(2HP)/3.65A/380V/50Hz/1420rpm/4)&#xff0c;直流发电机组&#xff1b;计算机&am…

2022秋 | PTA编程训练(一)

目录 1.素数对猜想 2.数组元素循环右移问题 3.水仙花数 4.找出不是两个数组共有的元素 5.找鞍点 6.验证“哥德巴赫猜想” 7.黑洞数 8.装箱问题 9.IP地址转换 10.龟兔赛跑 1.素数对猜想 题目详情&#xff1a; 让我们定义dn​为&#xff1a;dn​pn1​−pn​&#xff0…

测试用例设计之正交表法详解

正交实验法的由来 拉丁方名称的由来 古希腊是一个多民族的国家,国王在检阅臣民时要求每个方队中每行有一个民族代表,每列也要有一个民族的代表。 数学家在设计方阵时,以每一个拉丁字母表示一个民族,所以设计的方阵称为拉丁方。 什么是n阶拉丁方? 用n个不同的拉丁字母排成一…