C++ c+中的统一直方图实现+;
我使用的代码来计算图像的局部二进制模式(LBP)空间均匀直方图。我使用的是空间直方图函数,它计算图像局部斑块的直方图。每个计算出的面片大小为256,因此最终的Mat hist文件大小为1x(n*256)。我试图理解的是如何将直方图实现转换为统一的直方图实现。实现的直方图代码如下所示: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
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]
与统一直方图无关
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 =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;
}
}