在c#中创建gabor纹理

时间:2015-09-28 17:25:36

标签: c# textures opentk

我正在尝试创建一个纹理(在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

感谢。

1 个答案:

答案 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