Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中的统一直方图实现+;_C++_Histogram - Fatal编程技术网

C++ c+中的统一直方图实现+;

C++ c+中的统一直方图实现+;,c++,histogram,C++,Histogram,我使用的代码来计算图像的局部二进制模式(LBP)空间均匀直方图。我使用的是空间直方图函数,它计算图像局部斑块的直方图。每个计算出的面片大小为256,因此最终的Mat hist文件大小为1x(n*256)。我试图理解的是如何将直方图实现转换为统一的直方图实现。实现的直方图代码如下所示: void lbp::histogram_(const Mat& src, Mat& hist, int numPatterns) { hist = Mat::zeros(1, numPatterns

我使用的代码来计算图像的局部二进制模式(LBP)空间均匀直方图。我使用的是空间直方图函数,它计算图像局部斑块的直方图。每个计算出的面片大小为256,因此最终的Mat hist文件大小为1x(n*256)。我试图理解的是如何将直方图实现转换为统一的直方图实现。实现的直方图代码如下所示:

void lbp::histogram_(const Mat& src, Mat& hist, int numPatterns) {
hist = Mat::zeros(1, numPatterns, CV_32SC1);
for(int i = 0; i < src.rows; i++) {
    for(int j = 0; j < src.cols; j++) {
        int bin = src.at<_Tp>(i,j);
        hist.at<int>(0,bin) += 1;
    }
}
void lbp::直方图(常量Mat&src,Mat&hist,int numPatterns){
hist=Mat::零(1,numPatterns,CV_32SC1);
对于(int i=0;i
统一过程基于以下文件(针对局部二进制模式)。
如果二进制模式最多包含两个从0到1的位转换,则称局部二进制模式为统一模式,反之亦然,当位模式被视为圆形时。

[edit2]颜色减少

这很简单,只是通过表格重新排序
uniform[256]
与统一直方图无关

  • 为每种可能的颜色创建翻译(重新排序)表

    对于8位灰度,它是256色,例如:

    BYTE table[256] = {
            0,1,2,3,4,58,5,6,7,58,58,58,8,58,9,10,11,58,58,58,58,58,58,58,12,58,58,58,13,58,
            14,15,16,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,17,58,58,58,58,58,58,58,18,
            58,58,58,19,58,20,21,22,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,
            58,58,58,58,58,58,58,58,58,58,58,58,23,58,58,58,58,58,58,58,58,58,58,58,58,58,
            58,58,24,58,58,58,58,58,58,58,25,58,58,58,26,58,27,28,29,30,58,31,58,58,58,32,58,
            58,58,58,58,58,58,33,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,34,58,58,58,58,
            58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,
            58,35,36,37,58,38,58,58,58,39,58,58,58,58,58,58,58,40,58,58,58,58,58,58,58,58,58,
            58,58,58,58,58,58,41,42,43,58,44,58,58,58,45,58,58,58,58,58,58,58,46,47,48,58,49,
            58,58,58,50,51,52,58,53,54,55,56,57 };
    
    您也可以通过编程方式计算它,如线性分布的
    表[i]=(58*i)/255;
    ,但我建议它更类似于基于直方图的recolor示例:

    //hist[256] - already computed classic histogram
    //table[59] - wanted recolor table
    void compute_table(int *table,int *hist)
     {
     int i,c,threshold=1;
     for (c=-1,i=0;i<256;i++)
      if (hist[i]>threshold) { c++; table[i]=c; }
       else table[i]=58;
     }
    
  • 现在按住+键或键,形成LBP向量

    4x4 LBP示例:

              LBP =color[0][0];
     LBP<<=1; LBP|=color[0][1]; 
     LBP<<=1; LBP|=color[0][2]; 
     ...
     LBP<<=1; LBP|=color[3][3];
    
    LBP=color[0][0];
    
    LBP你所说的均匀直方图是什么意思?你想将图像转换为具有均匀直方图的图像,还是只想将子图像直方图组合为整个图像直方图,而无需再次计算?在提供的代码中,有一个针对非均匀直方图的空间直方图实现。我想压缩子图像直方图(只保留59个箱子)。这是另一个问题……将在一瞬间重新编辑答案,但这只是我对该论文的第一个见解(我没有意愿彻底阅读)我在这里查看Berak的代码,试图了解它是如何工作的。编辑后的答案…不知道为什么颜色58按原样分布…但我很可能只是为了改进纹理特征而没有使用颜色…如何将其转换为Mat文件。table to uchar table和hist to Mat hist。@ferres从Mat文件的大小可以看出它是si每种颜色的ngle字节(n*256),其中n是块数,因此mat文件已经是uchar(字节),没有任何标题…在我的代码中,我使用ints作为直方图,因为我的图像的分辨率比255像素高,如果将int更改为uchar,它也应该工作…(但需要确保计数不会溢出255 barier)
              LBP =color[0][0];
     LBP<<=1; LBP|=color[0][1]; 
     LBP<<=1; LBP|=color[0][2]; 
     ...
     LBP<<=1; LBP|=color[3][3];
    
    ??? hist=Mat::zeros(1, numPatterns, CV_32SC1);
    
    void lbp::histogram_(const Mat& src, Mat& hist, int numPatterns, bool init) {
    if (init) hist = Mat::zeros(1, numPatterns, CV_32SC1);
    for(int i = 0; i < src.rows; i++) {
        for(int j = 0; j < src.cols; j++) {
            int bin = src.at<_Tp>(i,j);
            hist.at<int>(0,bin) += 1;
        }
    }