Opencv实现Halcon中的频域滤波相关函数(三)

gen_sin_bandpass( : ImageFilter : Frequency, Norm, Mode, Width, Height : )

一、算法介绍

gen_sin_bandpass 算子生成一个二维带通滤波模板,形式上是一个 正弦调制的高斯波(类似于 Gabor filter)。

公式上类似于:

h(x, y) = \exp\left(-\frac{x{\prime}^2 + y{\prime}^2}{2\sigma^2}\right) \cdot \cos(2\pi f x{\prime} + \phi)

h(x, y) = \exp\left(-\frac{x{\prime}^2 + y{\prime}^2}{2\sigma^2}\right) \cdot \sin(2\pi f x{\prime} + \phi)

其中:
    •    (x{\prime}, y{\prime})是沿 Direction 方向旋转后的坐标;
    •    f 是调制频率;
    •    \phi是相位,单位为弧度。

二、原理

根据Halcon形式构造频率域滤波器:
H(u,v) = \begin{cases} \sin\left(\pi \cdot \frac{r}{f_0} \right), & 0 < r \leq f_0 \\ 0, & \text{otherwise} \end{cases}
其中:
    •    r = \sqrt{u^2 + v^2}:频域径向距离
    •    f_0 = \texttt{Frequency}:中心截止频率
    •    滤波器在半径 r \leq f_0 内 缓慢上升并下降为 0,峰值在r = f_0/2

代码

// 分母用 N-1,正频率紧接负频率
inline float halcFreq(int k, int N)
{
	int half = N / 2;
	return (k <= half)
		? float(k) / float(N - 1)
		: float(k - N) / float(N - 1);
}

void __cdecl GenSinBandpass(cv::Mat& ImageBandpass, double Frequency, const char* cNorm, const char* cMode, int Width, int Height)
{
	CV_Assert(Frequency >= 0.0f && Frequency <= 1.0f);
	// rft 模式只保留半谱
	int WF = (strcmp("rft", cMode) == 0) ? (Width / 2 + 1) : Width;

	ImageBandpass.create(Height, WF, CV_32F);
	for (int j = 0; j < Height; ++j)
	{
		float* row = ImageBandpass.ptr<float>(j);
		// v 索引
		int j0 = (strcmp("dc_center", cMode) == 0) ? ((j + Height / 2) % Height) : j;
		float v = halcFreq(j0, Height);
		for (int k = 0; k < WF; ++k)
		{
			int k0 = (strcmp("dc_center", cMode) == 0) ? ((k + Width / 2) % Width) : k;
			float u = halcFreq(k0, Width);

			// 径向频率
			float r = std::sqrt(u * u + v * v);

			float val = 0.0f;
			// DC (r=0) = 0;当 0<r<=Frequency 时,H(r)=sin(arg),arg ∈ [0,π]
			if (r > 0.0f && r <= Frequency) {
				val = std::sinf(float(CV_PI) * (r / (float)Frequency));
			}
			row[k] = val;
		}
	}
	// 应用归一化系数
	float f = 1.F / (Width * Height);
	if (strcmp("n", cNorm) == 0) {
		ImageBandpass *= f;
	}
}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zzzzzzzzzzzzzz---

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值