c++ opencv 复现 halcon算子 derivate_gauss

终于搞懂了halcon的derivate_gauss 里面的卷积核的生成逻辑了
测试 halcon算子 derivate_gauss 高斯一阶导数卷积

之前的逻辑使用的是生成高斯导数核(标准公式)

换成生成高斯导数核 (area‑integrated) 两者的结果就完全相等了

cpp 复制代码
// 高斯函数 G(x)
inline double gaussian(double x, double sigma) {
	const double sqrt2pi = std::sqrt(2.0 * CV_PI);
	return std::exp(-0.5 * x * x / (sigma * sigma)) / (sigma * sqrt2pi);
}
// 高斯累积分布函数 Φ(x) = 0.5*(1 + erf(x/(σ√2)))
inline double gaussianCDF(double x, double sigma) {
	return 0.5 * (1.0 + std::erf(x / (sigma * std::sqrt(2.0))));
}
// 生成高斯导数核 (area‑integrated)
// (order: 0 -> 平滑, 1 -> 一阶导, 2 -> 二阶导)
cv::Mat getDerivGaussianKernel(int ksize, double sigma, int order) {
	CV_Assert(ksize % 2 == 1 && ksize > 0);
		cv::Mat kernel(ksize, 1, CV_32F);
		float* k = kernel.ptr<float>(0);
		int center = (ksize - 1) / 2;

		for (int i = 0; i < ksize; ++i) {
			double x = i - center;          // 像素中心坐标
			double left = x - 0.5;          // 像素左边界
			double right = x + 0.5;         // 像素右边界

			double val = 0.0;
			switch (order) {
			case 0: // 平滑:∫ G(x) dx
				val = gaussianCDF(right, sigma) - gaussianCDF(left, sigma);
				break;
			case 1: // 一阶导:∫ dG/dx dx = G(right) - G(left)
				val = gaussian(right, sigma) - gaussian(left, sigma);
				break;
			case 2: // 二阶导:∫ d²G/dx² dx = dG/dx(right) - dG/dx(left)
				// dG/dx = -x/σ² * G(x)
			{
				double dG_left = -left / (sigma * sigma) * gaussian(left, sigma);
				double dG_right = -right / (sigma * sigma) * gaussian(right, sigma);
				val = dG_right - dG_left;
			}
			break;
			default:
				CV_Error(cv::Error::StsBadArg, "order must be 0,1,2");
			}
			k[i] = static_cast<float>(val);
		}
		return kernel;
	}
// 生成高斯导数核(标准公式)
// (order: 0->平滑, 1->一阶导, 2->二阶导)
Mat getDerivGaussianKernel_(int ksize, double sigma, int order) {
	CV_Assert(ksize % 2 == 1);
		Mat kernel(ksize, 1, CV_32F);
		float* k = kernel.ptr<float>(0);
		int center = (ksize - 1) / 2;
		double sigma2 = sigma * sigma;
		double sigma4 = sigma2 * sigma2;

		// 先计算标准高斯核 (order=0)
		for (int i = 0; i < ksize; i++) {
			double x = i - center;
			double g = exp(-x * x / (2.0 * sigma2)) / (sqrt(2.0 * CV_PI) * sigma);
			if (order == 0) {
				k[i] = (float)g;
			}
			else if (order == 1) {
				// 一阶导数核: -x / σ² * G
				k[i] = (float)(-x / sigma2 * g);
			}
			else if (order == 2) {
				// 二阶导数核: (x²/σ⁴ - 1/σ²) * G
				k[i] = (float)((x * x / sigma4 - 1.0 / sigma2) * g);
			}
		}
		return kernel;
	}
相关推荐
泡干脆面就番茄22 分钟前
MediaPipe人体感知全指南
opencv
鬼手点金9 小时前
Claude Code示范案例-进阶学习路径
java·服务器·前端·学习·计算机视觉·前向传播
闭包不眠10 小时前
端侧AI能省多少服务器钱:把账换成字节算
运维·服务器·图像处理·人工智能·计算机视觉
AomanHao10 小时前
【阅读笔记】Weighted Guided Image Filtering(WGIF)权重引导滤波
图像处理·人工智能·笔记·计算机视觉·滤波·引导滤波
李航198321 小时前
给自己的图形引擎,配上了AI渲染,做设计真是太方便了
人工智能·python·计算机视觉·ai·ai编程
Zentceh1 天前
安防监控夜视方案2026:AI全彩+边缘计算+云平台
图像处理·人工智能·科技·计算机视觉·车载系统·无人机·边缘计算
YOLO数据集集合1 天前
风机叶片表面损伤检测数据集 | 风机叶片 表面损伤 污渍检测 无人机巡检 风电运维9119期
运维·人工智能·计算机视觉·目标跟踪·无人机·智慧城市·电力巡检
小蒋观天下1 天前
行业拆解|两轮车检测AI摄像头的核心技术迭代、产品演进及未来技术发展
大数据·人工智能·安全·计算机视觉·ai大模型
鬼手点金1 天前
Claude Code示范案例-常用快捷命令
java·服务器·前端·计算机视觉·前向传播
兴通物联科技1 天前
对俄出口诚实标识 2026 时间节点与产线赋码采集技术方案
大数据·服务器·单片机·嵌入式硬件·深度学习·计算机视觉