我正在尝试创建一个纹理(在3-D字节数组中),这是一个彩色的gabor补丁。我正在使用OpenTK来映射纹理。纹理映射工作正常,但我的代码创建的纹理不是我需要的。
我提出的代码如下:
for (int x = 0; x < size; x++)
{
for (int y = 0; y < size; y++)
{
double sin_term = 0.5*(double)Math.Sin(10 * 3.14159 * ((double)x / (double)size));
sin_term += 0.5;
double gauss = 0.5+Math.Exp(-((Math.Pow(x,2)+Math.Pow(y,2))/(2*Math.Pow(sigma,2))));
double gabor = sin_term * gauss;
byteTexture2[j,i,0] = (byte)(((double)Colour.R * gabor));
byteTexture2[j,i,1] = (byte)(((double)Colour.G * gabor));
byteTexture2[j,i,2] = (byte)(((double)Colour.B * gabor));
}
}
我的数学并不好,所以我可能会偏离轨道,但我试图将正弦波乘以高斯。正弦波项似乎可以单独工作,但高斯可能是它遇到问题的地方。
非常感谢任何帮助。
已找到此问题的MATLAB代码,但没有找到c / c ++ / c#code
感谢。
答案 0 :(得分:0)
我最近编写了一个Gabor过滤器内核,用于OpenCV(使用C ++)。这是我的内核代码:
/// compute Gabor filter kernels
for (int i = 0; i < h; i++){
x = i - 0.5*(h - 1);
for (int j = 0; j < h; j++) {
y = j - 0.5*(h - 1);
gaborKernelCos.at<float>(i, j) = exp((-16 / (h*h))*(x*x + y*y))*cos((2 * M_PI*w / h)*(x*cos(q) + y*sin(q))) / (h*h);
gaborKernelSin.at<float>(i, j) = exp((-16 / (h*h))*(x*x + y*y))*sin((2 * M_PI*w / h)*(x*cos(q) + y*sin(q))) / (h*h);
}
}
输入参数是内核大小h
,波次数w
和过滤器方向q
。请注意,波数与滤波器像素波长相关l = h/w
。另外,我sigma
的值只是h
的常数倍。
就我所知,这不应该产生与你的代码截然不同的任何东西。您对sigma
的价值是否有意义?最多应该是sigma = 0.5*size
。