我是OpenCV和gabor过滤器的新手,只想获得这样的gabor小波:
我在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);
并获得此类输出:
我想我不需要申请Imgproc.filter2D
,但没有它我的应用程序因CvTypes
而崩溃,当我尝试通过转换类型来解决这个问题时,我会看到白屏。
任何人都可以帮助我获得这个gabor小波吗?
答案 0 :(得分:2)
您只需要:
normalize带有NORM_MINMAX
的gabor过滤器,以便值适合范围[0,255]
将标准化图片转换为CV_8U
(来自CV_64F
)convertTo
结果图像将是单通道灰度图像。
我无法为您提供Java代码,但我认为此C ++代码段仍然有用,因为基本上存在1到1的Java转换。然后,您需要提供getGaborKernel
参数以获得所需的形状。
这是我得到的结果:
代码:
#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);
}