- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在开发一个使用 生成合成指纹的库。 SFinGe 方法(由 Maltoni、Maio 和 Cappelli 提供)链接:http://biolab.csr.unibo.it/research.asp?organize=Activities&select=&selObj=12&pathSubj=111%7C%7C12&
其中一个步骤要求我将不同的 gabor 过滤器应用于图像,图像中的每个像素都有一个相关的方向和频率,因此卷积不是在整个图像上使用一个内核完成的,但过滤器必须在此过程中根据情况而改变在像素的这些属性上,图像上的每个像素都以不同的方式改变。
如果您以这种方式应用过滤器,并对图像进行多次卷积(您还必须在每次卷积后对图像进行二值化),您将获得:
一个主指纹,这个图像需要大约 20 秒才能生成(这太慢了,这就是我想用 FFT 来做的原因),因为我必须执行 5 次卷积才能完成它(你从几个开始随机黑点)。
我的过滤器是 30x30,图像是 275x400。总共有 36000 个过滤器,每个度数和密度(密度从 0 到 100)一个。我计划将过滤器的数量从 36000 减少到 9000,因为我可以用它们覆盖所有角度。此外,所有滤波器都经过预先计算并存储在滤波器组中。
这是gabor卷积实现的C#源代码:
这两种方法执行卷积:
/// <summary>
/// Convolve the image with the different filters depending on the orientation and density of the pixel.
/// </summary>
/// <param name="image">The image to be filtered.</param>
/// <param name="directionalMap">The directional map.</param>
/// <param name="densityMap">The density map.</param>
/// <returns></returns>
public double[,] Filter(double[,] image, double[,] directionalMap, double[,] densityMap)
{
int midX = FILTER_SIZE / 2;
int midY = FILTER_SIZE / 2;
double[,] filteredImage = new double[image.GetLength(0), image.GetLength(1)];
double[,] filteredImageWithValuesScaled = new double[image.GetLength(0), image.GetLength(1)];
double[,] finalImage = new double[image.GetLength(0), image.GetLength(1)];
for (int i = 0; i < image.GetLength(0); i++)
for (int j = 0; j < image.GetLength(1); j++)
{
double pixelValue = GetPixelConvolutionValue(image, this.filterBank[(int)Math.Floor((directionalMap[i, j] * 180 / Math.PI))][Math.Round(densityMap[i, j], 2)], i - midX, j - midY);
filteredImage[i, j] = pixelValue;
}
filteredImageWithValuesScaled = this.RescaleValues(filteredImage, 0.0, 255.0);
return filteredImageWithValuesScaled;
}
/// <summary>
/// Gets the pixel convolution value.
/// </summary>
/// <param name="image">The image.</param>
/// <param name="filter">The filter.</param>
/// <param name="sourceX">The source X.</param>
/// <param name="sourceY">The source Y.</param>
/// <returns></returns>
private double GetPixelConvolutionValue(double[,] image, double[,] filter, int sourceX, int sourceY)
{
double result = 0.0;
int totalPixels = 0;
for (int i = 0; i < filter.GetLength(0); i++)
{
if(i + sourceX < 0 || i + sourceX >= image.GetLength(0))
continue;
for (int j = 0; j < filter.GetLength(1); j++)
{
if(j + sourceY < 0 || j + sourceY >= image.GetLength(1))
continue;
double deltaResult = image[sourceX + i,sourceY + j] * filter[i, j];
result += deltaResult;
++totalPixels;
}
}
double filteredValue = result / totalPixels;
return filteredValue;
}
这两种方法为滤波器组生成不同的 Gabor 滤波器:
/// <summary>
/// Creates the gabor filter.
/// </summary>
/// <param name="size">The size.</param>
/// <param name="angle">The angle.</param>
/// <param name="wavelength">The wavelength.</param>
/// <param name="sigma">The sigma.</param>
/// <returns></returns>
public double[,] CreateGaborFilter(int size, double angle, double wavelength, double sigma)
{
double[,] filter = new double[size, size];
double frequency = 7 + (100 - (wavelength * 100)) * 0.03;
int windowSize = FILTER_SIZE/2;
for (int y = 0; y < size; ++y)
{
for (int x = 0; x < size; ++x)
{
int dy = -windowSize + y;
int dx = -windowSize + x;
filter[x, y] = GaborFilterValue(dy, dx, frequency, angle, 0, sigma, 0.80);
}
}
return filter;
}
/// <summary>
/// Gabor filter values generation.
/// </summary>
/// <param name="x">The x.</param>
/// <param name="y">The y.</param>
/// <param name="lambda">The wavelength.</param>
/// <param name="theta">The orientation.</param>
/// <param name="phi">The phaseoffset.</param>
/// <param name="sigma">The gaussvar.</param>
/// <param name="gamma">The aspectratio.</param>
/// <returns></returns>
double GaborFilterValue(int x, int y, double lambda, double theta, double phi, double sigma, double gamma)
{
double xx = x * Math.Cos(theta) + y * Math.Sin(theta);
double yy = -x * Math.Sin(theta) + y * Math.Cos(theta);
double envelopeVal = Math.Exp(-((xx * xx + gamma * gamma * yy * yy) / (2.0f * sigma * sigma)));
double carrierVal = Math.Cos(2.0f * (float)Math.PI * xx / lambda + phi);
double g = envelopeVal * carrierVal;
return g;
}
我的目标是将这个时间减少到 1 秒以下(有几个程序在这段时间内做完全相同的事情)。因此,由于直接卷积方法对我不起作用,我决定实现快速傅立叶变换卷积,但问题在于 FFT 一次将相同的内核应用于整个图像,我需要更改每个像素的内核,因为每个像素都必须根据其属性(密度和方向)进行更改。在这篇文章中
How to apply Gabor wavelets to an image?
reve-etrange 解释了如何将不同的 gabor 过滤器应用于图像,但问题是他这样做的方式是将不同的过滤器应用于整个图像,然后对响应求和,而我需要的是从不同像素到不同像素的响应过滤器。
/// <summary>
/// Convolve the image using FFT.
/// </summary>
/// <param name="image">The image to be filtered.</param>
/// <param name="directionalMap">The directional map.</param>
/// <param name="densityMap">The density map.</param>
/// <param name="FFT">if set to <c>true</c> [FFT].</param>
/// <returns></returns>
public double[,] Filter(double[,] image, double[,] directionalMap, double[,] densityMap, bool FFT)
{
double[,] filter = null;
double[,] paddedFilter = null;
double[,] paddedImage = null;
double[,] croppedImage = null;
double[,] filteredImage = new double[image.GetLength(0), image.GetLength(1)];
double[,] filteredImageWithValuesScaled = new double[image.GetLength(0), image.GetLength(1)];
double[,] finalImage = new double[image.GetLength(0), image.GetLength(1)];
filter = this.filterBank[70][0];
paddedFilter = PadImage(filter, 512, 512, 0, 0); // Pad the filter to have a potency of 2 dimensions.
paddedImage = PadImage(image, 512, 512, 0, 0); // Pad the image to have a potency of 2 dimensions.
FFT fftOne = new FFT(paddedImage);
FFT fftTwo = new FFT(paddedFilter);
fftOne.ForwardFFT();
fftTwo.ForwardFFT();
FFT result = fftOne * fftTwo;
result.InverseFFT();
filteredImage = result.GreyImage;
filteredImageWithValuesScaled = this.RescaleValues(filteredImage, 0.0, 255.0);
croppedImage = CropImage(filteredImageWithValuesScaled, image.GetLength(0), image.GetLength(1));
return croppedImage;
}
所以我要问的是,您如何使用 FFT 获得从不同像素到不同内核的响应?如果这是不可能的,有没有办法改进我的直接卷积,使其至少快 20 倍?
最佳答案
我找到了一种方法,可以使用不同的 gabor 滤波器对图像进行卷积,并使用 FFT 根据像素的局部特征收集像素的响应。
这称为上下文过滤,通常当您过滤图像时,您只会将单个内核应用于整个事物,但在上下文过滤中,过滤器的特征会根据本地上下文(在这种情况下,像素的密度和方向)而变化。
在直接卷积中,过程非常简单,您只需在卷积的每一步更改内核,但在 FFT 卷积中,由于内核应用于频域中的图像,您无法在此过程中更改滤波器属性。因此,您这样做的方法是分别将图像与每个过滤器进行卷积,这将提供 N 个过滤图像,其中 N 是过滤器组中过滤器的数量,然后您必须构建最终图像,从中获取信息基于您正在重新创建的像素的上下文的不同过滤图像。
因此,对于每个像素,您查看其方向和密度属性,然后从过滤图像中获取该像素位置的值,该图像是通过将原始图像与具有相同属性的过滤器进行卷积而生成的。
以下是该过程的示例:
这是方向图的图形表示。
我对所有像素使用相同的密度来减少生成的过滤器数量。
这是源图像:
这是使用的三个过滤器的示例(0 度、45 度、90 度):
以下是源图像与不同过滤器进行不同程度卷积的三个示例:
最后这是生成的图像,图像是根据像素的方向和密度从不同过滤图像中获取像素值创建的。
这个过程是很多 比直接卷积慢 =(,因为你必须先用所有的过滤器对原始图像进行卷积。生成最终图像大约需要一分钟。
到目前为止,我似乎坚持使用直接卷积=/。
谢谢阅读。
关于image - 如何使用FFT根据局部方向和密度调整具有不同gabor滤波器的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12878754/
我尝试创建一个 Gabor 过滤器。我们都知道这种过滤器比任何其他过滤器都复杂,因为它具有更复杂的特征,例如具有不同的尺度和方向。Gabor滤波器的方程为: 要创建具有特定比例和方向的 Gabor 滤
我有以下 gabor 过滤器来提取图像纹理特征.. a=imread('image0001.jpg'); a=double(a); a=a-mean(a(:)); [r,c,l]=size(a);
如何设计用于模式识别的 Gabor 滤波器。我就是想不通。 最佳答案 我提供的链接将清除您关于 GABOR FILTER 的基础知识,并让您开始模式识别 Basics of gabor filter
This问题很好地描述了 gabor 过滤器系列及其应用。但是,没有关于滤波器的波长(空间频率)的描述。 gabor 小波的创建在以下 for 循环中完成: for v = 0 : 4 for
Here我们有 Gabor 过滤器的空间域实现。但是,我需要在频域中实现 Gabor 滤波器 for performance reasons. 我找到了 Frequency Domain equati
我使用 lire, java对于图像检索项目,我想为输入图像的每个像素计算 gabor 小波的振幅 ref here . lire 库中的默认函数返回一个下采样的特征向量。我想要的是 gabor 小波
我的目标是对汽车类型(轿车、SUV、掀背车)进行分类,之前我使用角特征进行分类,但效果不太好,所以现在我正在尝试 Gabor 特征。 code from here 现在提取特征,假设当我给出图像作为输
我目前正在使用 HOG、LBP 和 Gabor 作为特征提取来进行人物检测。但是,当我使用gabor特征提取时,虽然准确率很高,但检测时间很长。我正在从这里实现 gabor 特征提取代码: Gabor
我计算了 8 个 Gabor 滤波器,Theta 旋转 m*PI/8。 作为 OpenCv cv2.getGaborKernel 输入的 Gabor 内核参数:ksize = 11, theta =
我想在将方形采样图像转换为六边形采样图像后使用 Gabor 滤波器作为插值方法。 我可以在六角采样图像中使用普通的 Gabor 滤波器实现吗?或者我应该修改代码吗?如果是,那么我应该为六边形采样图像修
我正在尝试实现一个用于纹理图像分割的 gabor 过滤器。我在 MATLAB 中这样做并引用了 paper - A level set and Gabor-based Active Contour A
我是图像处理的新手。我想知道如何在具有 12 个不同方向(例如 0、15、30、45 到 165)的图像上应用 gabor 滤波器。我想将此 gabor 滤波器应用于 12 个方向并且必须显示每个方向
我正在研究用于特征提取的超像素。我已经成功地将超像素功能应用于图像。 A = imread('kobi.png'); [L,N] = superpixels(A,5); figure BW = bou
我正在尝试对图像执行 gabor 过滤器。 %% Read clear all; close all; clc; I=imread('test.png'); imshow(I); %% Crop I2
我如何在图像上应用这些 Gabor 滤波器小波? close all; clear all; clc; % Parameter Setting R = 128; C = 128; Kmax = pi
我正在尝试创建一个称为 Gabor patch 的二维图像可变大小。 Gabor 补丁最好被认为是二维正弦和二维高斯的卷积。 下面是用于生成代码的函数。代码移植自 this tutorial对于 Ma
我目前正在阅读这篇论文:Approximations in the HMAX Model ,我对使用 Box 滤波器逼近 gabor 滤波器特别感兴趣。 去年我开发了一个合成指纹生成器(你可以在这里看
我是 OpenCV 和 gabor 过滤器的新手,只想获得这样的 gabor 小波: 我在 Java 中使用这个 OpenCV 代码: double sigma_bar = 40; double th
我想知道当将 gabor 滤波器应用于图像以进行特征提取时,特征向量的构成是什么?我想要用于面部表情分类的特征向量。我有 gabor 过滤器的代码,我也得到了过滤后的图像,但我对特征向量感到困惑。 最
我正在尝试构建一个带有一些转换层的 CNN,其中层中一半的过滤器是固定的,另一半在训练模型时是可学习的。但我没有找到任何相关信息。 我正在尝试做的与他们在这篇论文中所做的相似https://arxiv
我是一名优秀的程序员,十分优秀!