如何理解频率图像中描述的平均像素数?
我试图实现由Anil Jain等人提出的广泛使用的指纹图像增强算法。 在第2.5节中实施脊波频率图像计算的步骤时,我很难理解某些描述。 步骤描述如下:
如果在定向窗口中没有细节点和奇点出现,则x-标记形成离散的正弦波形,其频率与定向窗口中的脊和谷的频率相同。 因此,脊和谷的频率可以从x-标记估计。 假设T(i,j)是x签名中两个连续峰值之间的平均像素数,则计算频率为:
我的问题是 :我不明白如何获得两个连续峰之间的平均像素数,因为本文没有提及如何区分算法中的峰。 那么,如何决定这些峰值像素来对它们进行计数? 有人能解释我在这里错过了什么吗?
此外,我用这样的OpenCV实现了这些步骤,如果有人能够通过我的步骤帮助我仔细检查我是否正确实施,我将非常感激:
void Enhancement::frequency(cv::Mat inputImage, cv::Mat orientationMat)
{
int blockSize = 16;
int windowSize = 32;
//compute x-signature
for (int i = blockSize / 2; i < inputImage.rows - blockSize / 2; i += blockSize)
{
for (int j = blockSize / 2; j < inputImage.cols - blockSize / 2; j += blockSize)
{
int u = 0;
int v = 0;
std::vector<float> xSignature;
for (int k = 0; k < windowSize; k++)
{
float sum = 0.0;
for (int d = 0; d < blockSize; d++)
{
float pixel = orientationMat.at<float>(i, j);
u = i + (d - 0.5 * blockSize) * cos(pixel) + (k - 0.5 * windowSize) * sin(pixel);
v = j + (d - 0.5 * blockSize) * sin(pixel) + (0.5 - windowSize) * cos(pixel);
sum += static_cast<float>(inputImage.at<uchar>(u, v));
}
xSignature.push_back(sum);
}
} // end of j-loop
} // end of i-loop
}
更新
在搜索一些文章后,我发现有人提到如何确定像这样的峰值像素:
但是,我仍然不清楚这一点。 这是否意味着我可以在我的灰度图像上采用块式形态扩张操作(在进一步处理之前,我已经在OpenCV中将图像从RGB转换为灰度)? dilation equals original values
这个词是否dilation equals original values
意味着the pixel intensity after morphological dilation equals its original value
? 我迷失在这里。
我不知道你正在谈论的具体算法,但也许我可以提供一些一般性建议。
我猜这个问题的核心是在噪声信号中区分“什么是峰值,什么是噪声”(因为在某种意义上RL输入图像总是有噪声;我认为代码中用于峰值检测的相关输入向量是xSignature)。 一旦确定了峰值,计算平均峰值距离应该相当简单。
至于峰值检测,有大量的论文描述了非常复杂的算法,但我会概述一些我在图像处理工作中使用的尝试和真正的方法。
平滑
如果您知道预期的峰宽w,您可以作为第一步应用一些平滑处理,通过在一个约为预期峰宽的窗口上进行求和(从xw / 2到x + w / 2) )。 您实际上并不需要计算滑动窗口的平均值(除以w),因为对于峰值检测,绝对比例无关并且总和与平均值成比例。
最小 - 最大识别
您可以运行(可能平滑的)剖面矢量并确定最小和最大指数(例如,通过简单的斜率符号更改)。 将这些位置存储在map<int (coordinate), bool (isMax)>
或map<int (coordinate), double (value at coordinate)>
。 或者使用一个结构作为保存所有相关信息的值(bool isMax,double value,bool isAtBoundary,...)
评估检测到的峰的质量
对于上一步中找到的每个最大值,确定高度差,并可能确定上一个和下一个最小值的斜率,从而得到质量。 这一步取决于你的问题领域。 也许“峰值”不需要被两侧的最小值所限制(在这种情况下,上面的最小检测必须比斜率变化更复杂)。 峰值可能有最小或最大宽度限制。 等等。
根据上述问题计算每个最大位置的质量值。 我经常使用类似Q_max =(从最大到相邻分钟的平均高度差)/(分布的最大 - 最小值)。 那么最高候选人最多可以具有1的“质量”,并且至少为0。
迭代所有最大值,计算它们的质量并将它们放入一个multimap或其他容器中,这些容器可以进行排序,以便稍后以降序质量迭代您的峰值。
区分峰和非峰
以降低质量迭代您的峰值。 可能将所有不符合最小或最大宽度/高度/质量/距离的最优质量/ ...要求归为您的问题领域的峰值。 保持休息。 完成。
在你的情况下,你会通过坐标重新排列峰值并计算它们之间的平均距离。
我知道这是模糊的,但对峰值检测没有普遍正确的答案。 也许在你正在使用的文件中存在某处隐藏的特定处方,但大多数作者忽略了这种“单纯的技术性”(通常,如果你通过电子邮件联系他们,他们不能记住或以其他方式再现他们如何做,呈现他们的结果基本上不可重现)。
链接地址: http://www.djcxy.com/p/89805.html上一篇: How to understand the average pixel number described in the frequency image?