外贸网站模板哪里下载wordpress4.8.1
2026/1/11 6:32:42 网站建设 项目流程
外贸网站模板哪里下载,wordpress4.8.1,2017做网站怎么赚钱,石家庄站到石家庄北站一、概述 采用一维高斯滤波#xff08;可分离高斯滤波#xff09;的核心原因在于#xff1a;在保持与二维高斯滤波完全相同数学效果的前提下#xff0c;大幅降低计算复杂度并提升工程效率。由于二维高斯核可以严格分解为两个相互独立的一维高斯核#xff08;横向 纵向可分离高斯滤波的核心原因在于在保持与二维高斯滤波完全相同数学效果的前提下大幅降低计算复杂度并提升工程效率。由于二维高斯核可以严格分解为两个相互独立的一维高斯核横向 × 纵向可大大降低计算量对于大小为M×n的图像和大小为m×n的核实现卷积操作需要MNmn次乘法核加分运算计算公式如下3.35但是如果滤波核是可分离的对于w1行卷积核第一次卷积只需要MNm次乘法和加分运算因为w1卷积核的大小为m×1,对于w2列卷积核第二次卷积只需要MNn次乘法和加分运算所以共需要MN(mn)次乘法和加分运算因此可分离的核执行卷积运算可以大大减少计算量滤波核越大越明显(可见如下公式3.44)。二、二维高斯滤波首先我们讲解一下二维高斯滤波核的生成这里根据高斯函数可直接生成高斯滤波核代码如下// 二维高斯滤波核 std::vectorstd::vectordouble GaussianKernelGenerate(int kSize, double sigma) { int k kSize / 2; std::vectorstd::vectordouble kernel(kSize, std::vectordouble(kSize)); double sum 0.0; const double PI 3.14159265358979323846; for (int i -k; i k; i) { for (int j -k; j k; j) { double value static_castdouble((1.0 / (2 * PI * sigma * sigma)) * (exp(-(i * i j * j) / (2 * sigma * sigma)))); kernel[i k][j k] value; sum value; } } // 归一化 for (int i 0; i kSize; i) { for (int j 0; j kSize; j) { kernel[i][j] / sum; } } return kernel; }三、一维高斯滤波同理由高斯函数可知我们可以分解为两个一维的滤波进行卷积计算分离式滤波核正是opencv获得高斯滤波核的底层实现原理这里我们也用底层代码实现我们生成一维的卷积核先用一维卷积核对图像行向量进行卷积再用该滤波对图像的列向量进行卷积即可。代码如下// 分离式高斯滤波核 std::vectordouble GenerateSeparateGaussianKernel(int kSize, double sigma) { int k kSize / 2; double sum 0.0; std::vectordoublekernel(kSize, 0); const double PI 3.14159265358979323846; for (int i -k; i k; i) { double value static_castdouble((1.0 / (sqrt(2 * PI) * sigma)) * exp(-(i * i) / (sqrt(2) * sigma))); kernel[i k] value; sum value; } // 归一化 for (int i 0; i kSize; i) { kernel[i] / sum; } return kernel; }四、滤波分离这里我们重点讲解一下滤波分离首先我们是知道高斯函数是可分离的。那对于一般的滤波核呢我们不可以直接进行一维滤波计算首先是否可分离需要满足矩阵可分离性质即满足矩阵 行 × 列也就是秩为1。如果我们在计算位置滤波核的时候不确定这个矩阵的秩是否为1我们可以先用 SVD 计算一下它的秩或者观察它的奇异值。如果除了第一个奇异值外其他奇异值不为 0或接近 0那就不能分离。如果秩为1我们可以采用以下方法对其进行分解在核中找到任何一个非0元素并将其值表示为E形成行向量r和列向量c他们分别等于E元素所在的那一行和那一列这个时候这个r和c就是分离出来的行滤波核和列滤波核原理如下。代码如下// 将滤波核进行分离 void splitGaussianKernel(const std::vectorstd::vectordouble GaussianKernel, std::vectordouble c, std::vectordouble r) { // 获取高斯核的行和列 int rows GaussianKernel.size(); int cols GaussianKernel[0].size(); r.resize(rows); c.resize(cols); // 找到非零元素高斯核的中心就是最稳定的非零元素 double center GaussianKernel[rows / 2][cols / 2]; // 提取非零元素所在行 for (int i 0; i rows; i) { r[i] GaussianKernel[i][center]; } // 提取非零元素列 for (int j 0; j cols; j) { c[j] GaussianKernel[center][j]; } }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询