2015-11-18 148 views
3

我在OpenCV中非常新,Gabor滤波器,只是想获得Gabor小波这样的:Gabor滤波器(小波)

enter image description here

我在Java中使用OpenCV的代码:

double sigma_bar = 40; 
double theta_bar = 0.5; 
double lambda_bar = 11; 
double gamma_bar = 100; 
double psi_bar = 90; 
double kernel_size = 150; 
Mat intermediate = new Mat(150, 150,CvType.CV_8U); 
Mat output = Mat.zeros(150, 150, CvType.CV_32F); 
Mat gabor_mat = Imgproc.getGaborKernel(new Size(kernel_size, kernel_size),sigma_bar/10., theta_bar/180. * Math.PI,lambda_bar, gamma_bar/100., psi_bar/180. * Math.PI, CvType.CV_32F); 
Imgproc.filter2D(intermediate, output, -1, gabor_mat); 
Bitmap temp = Bitmap.createBitmap(intermediate.cols(),  intermediate.rows(), Bitmap.Config.ARGB_8888); 
Utils.matToBitmap(output, temp); 
ImageView gabor = (ImageView) findViewById(R.id.gabor); 
gabor.setImageBitmap(temp); 

,并得到这样的输出:

enter image description here

我想我不需要申请Imgproc.filter2D,但没有它,我的应用程序崩溃,因为CvTypes,当我试图通过转换类型来解决这个问题时,我得到白色屏幕。

任何人都可以帮助我得到这个gabor小波吗?

回答

2

你只需要:

  1. normalizeNORM_MINMAX Gabor滤波器,使价值观匹配范围[0,255]

  2. 标准化的图像转换为CV_8U(从CV_64F)与convertTo

  3. 结果图像将是单通道灰度图像。

我不能给你的Java代码来做到这一点,但我认为这个C++代码片段仍然是有用的,因为基本上存在着1至1转换到Java。然后您需要输入getGaborKernel的参数以获得您需要的形状

这是结果我得到:

enter image description here

代码:

#include <opencv2/opencv.hpp> 
using namespace cv; 

int main() 
{ 
    Mat kernel = getGaborKernel(Size(151, 151), 10, 0.1, 10, 1, CV_PI/2.0); 
    // kernel is of type CV_64F 

    Mat normalized; 
    normalize(kernel, normalized, 0, 255, NORM_MINMAX); 
    // normalized is of type CV_64F, but with values in [0, 255] 

    Mat converted; 
    normalized.convertTo(converted, CV_8U, 1, 0); 
    // converted is of type CV_8U 

    imshow("Gabor", converted); 
    waitKey(); 

    return(0); 
} 
+0

谢谢你这么多三木:)它的工作原理! – TH1995