如何在OpenCV中合并Gabor滤波器的结果
How to combine the results of Gabor filter in OpenCV
我正在尝试通过在 OpenCV 中使用 gabor 过滤器来增强指纹图像 Java 以及一组 4 个过滤器 (4 theta):
private Mat enhanceImg(Mat myImg){
// prepare the output matrix for filters
Mat gabor1 = new Mat (myImg.width(), myImg.height(), CvType.CV_8UC1);
Mat gabor2 = new Mat (myImg.width(), myImg.height(), CvType.CV_8UC1);
Mat gabor3 = new Mat (myImg.width(), myImg.height(), CvType.CV_8UC1);
Mat gabor4 = new Mat (myImg.width(), myImg.height(), CvType.CV_8UC1);
Mat enhanced = new Mat (myImg.width(), myImg.height(), CvType.CV_8UC1);
//predefine parameters for Gabor kernel
Size kSize = new Size(31,31);
double theta1 = 0;
double theta2 = 45;
double theta3 = 90;
double theta4 = 135;
double lambda = 30;
double sigma = 24;
double gamma = 1;
double psi = 0;
// the filters kernel
Mat kernel1 = Imgproc.getGaborKernel(kSize, sigma, theta1, lambda, gamma, psi, CvType.CV_32F);
Mat kernel2 = Imgproc.getGaborKernel(kSize, sigma, theta2, lambda, gamma, psi, CvType.CV_32F);
Mat kernel3 = Imgproc.getGaborKernel(kSize, sigma, theta3, lambda, gamma, psi, CvType.CV_32F);
Mat kernel4 = Imgproc.getGaborKernel(kSize, sigma, theta4, lambda, gamma, psi, CvType.CV_32F);
// apply filters on my image. The result is stored in gabor1...4
Imgproc.filter2D(myImg, gabor1, -1, kernel1);
Imgproc.filter2D(myImg, gabor2, -1, kernel2);
Imgproc.filter2D(myImg, gabor3, -1, kernel3);
Imgproc.filter2D(myImg, gabor4, -1, kernel4);
//enhanced = gabor1+gabor2+gabor3+gabor4 - something like that
return enhanced;
}
现在,我的问题是如何组合这些结果,gabor1、gabor2、gabor3 和 gabor4,以获得完整的增强图像。
我尝试使用 Core.add(src1,src2,dst)
或
Core.addWeighted(enhanced , 0, gabor1, 1, 0, enhanced );
Core.addWeighted(enhanced , 1, gabor2, 1, 0, enhanced );
Core.addWeighted(enhanced , 1, gabor3, 1, 0, enhanced );
Core.addWeighted(enhanced , 1, gabor4, 1, 0, enhanced );
,但似乎做了某种减法,最后我得到的图像几乎是白色的。
希望有人能帮助我。我正在使用 Java,但 C++ 实现非常相似。
编辑:
以下是输入和结果的图像:
输入图片:
Img gabor1:
Img gabor2:
Img gabor3:
Img gabor4:
最后添加(带加权)Img:
好的,我想我已经解决了我的问题。
我的输入图像 (myImg) 的类型为 CV_8UC1,但 gabor 内核的类型为 CV_32F 或 CV_64F。所以我必须在处理之前将 myImg 转换为该类型:
myImg.convertTo(myImg, CvType.CV_32F);
此外,我将 gabor1...4 定义为 CV_32F 类型而不是 CV_8UC1。
然后,我将 Core.addWeighted(...)
应用于所有 4 个 gabor 过滤器(就像我的问题上面那样),我得到了预期的结果。
这有点傻,但这是一个常见的错误(我认为)。
我正在尝试通过在 OpenCV 中使用 gabor 过滤器来增强指纹图像 Java 以及一组 4 个过滤器 (4 theta):
private Mat enhanceImg(Mat myImg){
// prepare the output matrix for filters
Mat gabor1 = new Mat (myImg.width(), myImg.height(), CvType.CV_8UC1);
Mat gabor2 = new Mat (myImg.width(), myImg.height(), CvType.CV_8UC1);
Mat gabor3 = new Mat (myImg.width(), myImg.height(), CvType.CV_8UC1);
Mat gabor4 = new Mat (myImg.width(), myImg.height(), CvType.CV_8UC1);
Mat enhanced = new Mat (myImg.width(), myImg.height(), CvType.CV_8UC1);
//predefine parameters for Gabor kernel
Size kSize = new Size(31,31);
double theta1 = 0;
double theta2 = 45;
double theta3 = 90;
double theta4 = 135;
double lambda = 30;
double sigma = 24;
double gamma = 1;
double psi = 0;
// the filters kernel
Mat kernel1 = Imgproc.getGaborKernel(kSize, sigma, theta1, lambda, gamma, psi, CvType.CV_32F);
Mat kernel2 = Imgproc.getGaborKernel(kSize, sigma, theta2, lambda, gamma, psi, CvType.CV_32F);
Mat kernel3 = Imgproc.getGaborKernel(kSize, sigma, theta3, lambda, gamma, psi, CvType.CV_32F);
Mat kernel4 = Imgproc.getGaborKernel(kSize, sigma, theta4, lambda, gamma, psi, CvType.CV_32F);
// apply filters on my image. The result is stored in gabor1...4
Imgproc.filter2D(myImg, gabor1, -1, kernel1);
Imgproc.filter2D(myImg, gabor2, -1, kernel2);
Imgproc.filter2D(myImg, gabor3, -1, kernel3);
Imgproc.filter2D(myImg, gabor4, -1, kernel4);
//enhanced = gabor1+gabor2+gabor3+gabor4 - something like that
return enhanced;
}
现在,我的问题是如何组合这些结果,gabor1、gabor2、gabor3 和 gabor4,以获得完整的增强图像。
我尝试使用 Core.add(src1,src2,dst)
或
Core.addWeighted(enhanced , 0, gabor1, 1, 0, enhanced );
Core.addWeighted(enhanced , 1, gabor2, 1, 0, enhanced );
Core.addWeighted(enhanced , 1, gabor3, 1, 0, enhanced );
Core.addWeighted(enhanced , 1, gabor4, 1, 0, enhanced );
,但似乎做了某种减法,最后我得到的图像几乎是白色的。
希望有人能帮助我。我正在使用 Java,但 C++ 实现非常相似。
编辑:
以下是输入和结果的图像:
输入图片:
Img gabor1:
Img gabor2:
Img gabor3:
Img gabor4:
最后添加(带加权)Img:
好的,我想我已经解决了我的问题。
我的输入图像 (myImg) 的类型为 CV_8UC1,但 gabor 内核的类型为 CV_32F 或 CV_64F。所以我必须在处理之前将 myImg 转换为该类型:
myImg.convertTo(myImg, CvType.CV_32F);
此外,我将 gabor1...4 定义为 CV_32F 类型而不是 CV_8UC1。
然后,我将 Core.addWeighted(...)
应用于所有 4 个 gabor 过滤器(就像我的问题上面那样),我得到了预期的结果。
这有点傻,但这是一个常见的错误(我认为)。