如何在opencv中将gabor过滤器应用于图像?

时间:2014-04-15 07:25:32

标签: c++ image opencv

我有一些带有gabor过滤器代码的小波,它是这样的...... wavelets

但我不知道如何在我的图像上使用它?我知道matlab有一些方法,即matlab way。但是我使用的是opencv,而且我对这个领域很新,matlab,我不知道如何从matlab代码编写opencv代码,所以我应该用opencv这样做吗?非常感谢!

**** ****更新
我试过了@ berak的方式,这是原始图片

这是在我应用过滤器enter image description here后,只是所有白色而且没有剩下的,下面是我的参数,

int kernel_size = 31;
double sig = 1, th = 0, lm = 1.0, gm = 0.02, ps = 0;
cv::Mat kernel = cv::getGaborKernel(cv::Size(kernel_size, kernel_size), sig, th, lm, gm, ps);
cv::filter2D(src_f, dest, CV_32F, kernel);

我的设置有什么问题吗?

2 个答案:

答案 0 :(得分:10)

基本上,你将img转换为float,

然后构建一个内核:

cv::Mat kernel = cv::getGaborKernel(cv::Size(kernel_size,kernel_size), sig, th, lm, gm, ps);

并将其应用于filter2D:

cv::filter2D(src_f, dest, CV_32F, kernel);

[编辑]

**我不确定,但您可能需要1声道图片作为输入。

** imshow看到,你的图像是浮动的,只是让超过1.0的任何东西饱和,所以你得到一个全白的图像。

(这只是一个可视化问题,需要一些转换/缩放来治愈它)

Mat in = imread("XfNal.jpg",0);          // load grayscale
Mat dest;
Mat src_f;
in.convertTo(src_f,CV_32F);

int kernel_size = 31;
double sig = 1, th = 0, lm = 1.0, gm = 0.02, ps = 0;
cv::Mat kernel = cv::getGaborKernel(cv::Size(kernel_size,kernel_size), sig, th, lm, gm, ps);
cv::filter2D(src_f, dest, CV_32F, kernel);

cerr << dest(Rect(30,30,10,10)) << endl; // peek into the data

Mat viz;
dest.convertTo(viz,CV_8U,1.0/255.0);     // move to proper[0..255] range to show it
imshow("k",kernel);
imshow("d",viz);
waitKey();

clip_gabor

答案 1 :(得分:-3)

更改sigma = 3 lambda = 36 theta = 116 psi = 274