在图像上使用Gabor滤镜

时间:2014-11-27 15:05:51

标签: image algorithm matlab opencv image-processing

我正在寻找在opencv / matlab中编写一些代码,它们会将Gabor滤镜应用于图像以发现有趣的图像区域。我已经阅读了很多文献并看过一些以前的matlab / opencv代码,但我想自己尝试一下以确保我完全理解。

我有Gabor函数和图像的等式。我不确定我应该在算法中采取的步骤。我得到的一般想法是对图像进行离散傅立叶变换,将其与(Gabor?)它与Gabor函数相乘,然后对结果进行逆傅里叶变换。任何指针赞赏。谢谢!

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <math.h>

using namespace cv;

int main(int argc, char** argv)
{
int ks = 47;
int hks = (ks-1)/2;
int kernel_size=21;
double sig = 7;
double th = 200;
double ps = 90;
double lm = 0.5+ps/100.0;
double theta = th*CV_PI/180;
double psi = ps*CV_PI/180;
double del = 2.0/(ks-1);
double sigma = sig/ks;
double x_theta;
double y_theta;

Mat image = imread("C:\\users\\michael\\desktop\\tile1.tif",1), dest, src, src_f;

if (image.empty())
{
    return -1;
}

imshow("Src", image);

cvtColor(image, src, CV_BGR2GRAY);
src.convertTo(src_f, CV_32F, 1.0/255, 0);
if (!ks%2)
{
    ks+=1;
}

Mat kernel(ks,ks, CV_32F);

for (int y=-hks; y<=hks; y++)
{
    for (int x=-hks; x<=hks; x++)
    {
        x_theta = x*del*cos(theta)+y*del*sin(theta);
        y_theta = -x*del*sin(theta)+y*del*cos(theta);
        kernel.at<float>(hks+y,hks+x) = (float)exp(-0.5*(pow(x_theta,2)+pow(y_theta,2))/pow(sigma,2))* cos(2*CV_PI*x_theta/lm + psi);
    }
}


filter2D(src_f, dest, CV_32F, kernel); 
imshow("Gabor", dest);
Mat Lkernel(kernel_size*20, kernel_size*20, CV_32F);
resize(kernel, Lkernel, Lkernel.size());
Lkernel /= 2.;
Lkernel += 0.5;
imshow("Kernel", Lkernel);
Mat mag;
pow(dest, 2.0, mag);
imshow("Mag", mag);

waitKey(0);
return 0;

}

0 个答案:

没有答案