如何理解频率图像中描述的平均像素数?

我试图实现由Anil Jain等人提出的广泛使用的指纹图像增强算法。 在第2.5节中实施脊波频率图像计算的步骤时,我很难理解某些描述。 步骤描述如下:

  • 获得归一化图像G.
  • 将G分成大小为wxw(16 x 16)的块。
  • 对于以像素(i,j)为中心的每个块,计算在脊坐标系中定义的大小为lxw(32x16)的定向窗口。
  • 对于以像素(i,j)为中心的每个块,计算定向窗口内的脊和谷的x签名X [0],X1,...,X [l-1],其中
  • 在这里输入图像描述

    如果在定向窗口中没有细节点和奇点出现,则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?

    下一篇: Obtaining list of unique pixel values in OpenCV Mat