2025年LBP特征(5)MB-LBP、SEMB-LBP特征

LBP特征(5)MB-LBP、SEMB-LBP特征一 MB LBP 特征 全称为 Multiscale Block LBP 来源于论文 中科院的人发明的 在 Traincascade 级联目标训练检测中的 LBP 特征使用的就是 MB LBP MB LBP 的原理 将图像分成一个个小块 Block 每个小块再分为一个个的小区域

大家好,我是讯享网,很高兴认识大家。

一、MB-LBP特征

//MB-LBP特征的计算 void getMultiScaleBlockLBPFeature(cv::Mat src, cv::Mat &dst, int scale) { //定义并计算积分图像 int cellSize = scale / 3; int offset = cellSize / 2; //Mat cellImage(src.rows - 2 * offset, src.cols - 2 * offset, CV_8UC1); //for (int i = offset; i<src.rows - offset; i++) //{ // for (int j = offset; j<src.cols - offset; j++) // { // int temp = 0; // for (int m = -offset; m<offset + 1; m++) // { // for (int n = -offset; n<offset + 1; n++) // { // temp += src.at<uchar>(i + n, j + m); // } // } // //计算均值 // temp /= (cellSize*cellSize); // cellImage.at<uchar>(i - cellSize / 2, j - cellSize / 2) = uchar(temp); // } //} //划分的cell个数 int yCnt = (src.rows + cellSize - 1) / cellSize; int xCnt = (src.cols + cellSize - 1) / cellSize; Mat cellImage(yCnt, xCnt, CV_8UC1); for (int i = 0; i<yCnt ; i++) { for (int j = 0; j<xCnt; j++) { int temp = 0; int cnt = 0; for (int m = i*cellSize; m<(i+1)*cellSize; m++) { for (int n = j*cellSize; n<(j + 1)*cellSize; n++) { //判断是否超出原始图像边界 if (m >= src.rows || n >= src.cols) continue; temp += src.at<uchar>(m, n); cnt++; } } //计算均值 temp /= cnt; cellImage.at<uchar>(i, j) = uchar(temp); } } getOriginLBPFeature<uchar>(cellImage, dst); } int main() { cv::Mat src = imread("..\\..\\image\\keliamoniz1.jpg", 0); cv::Mat dst; //getOriginLBPFeature<uchar>(src, dst); //getCircularLBPFeatureOptimization<uchar>(src, dst, 1, 8); //getRotationInvariantLBPFeature<uchar>(src, dst, 1, 8); //getUniformPatternLBPFeature<uchar>(src, dst, 1, 8); getMultiScaleBlockLBPFeature(src, dst, 9); return 0; } 
讯享网

说明:参考的是https://blog.csdn.net/quincuntial/article/details/,但是博主写和论文逻辑不符合,按照博主的方法,变成了均值滤波了,结合论文描述重写测试结果如下图: 

      

       (a) 原图                                        (b)cellImage                             (c)MB-LBP图  

                                                

(a1) 原图                                         (b1)cellImage                             (c1)MB-LBP图

 

 二、SEMB-LBP

讯享网//求SEMB-LBP void SEMB_LBPFeature(cv::Mat src, cv::Mat &dst, int scale) { Mat MB_LBPImage; //得到MB_LBP特征图 getMultiScaleBlockLBPFeature(src, MB_LBPImage, scale); Mat histMat; int histSize = 256; float range[] = { float(0),float(255) }; const float* ranges = { range }; //计算LBP特征值0-255的直方图 calcHist(&MB_LBPImage, 1, 0, Mat(), histMat, 1, &histSize, &ranges, true, false); histMat.reshape(1, 1); vector<float> histVector(histMat.rows*histMat.cols); uchar table[256]; memset(table, 64, 256); if (histMat.isContinuous()) { //histVector = (int *)(histMat.data); //将直方图histMat变为vector向量histVector histVector.assign((float*)histMat.datastart, (float*)histMat.dataend); vector<float> histVectorCopy(histVector); //对histVector进行排序,即对LBP特征值的数量进行排序,降序排列 sort(histVector.begin(), histVector.end(), greater<float>()); for (int i = 0; i<63; i++)//取排序前63为的特征值 { for (int j = 0; j<histVectorCopy.size(); j++) { //j代表特征值的大小 //histVectorCopy[j]:排序前当前特征值的数量 //histVector[i]:排序后前63位特征值数量 if (histVectorCopy[j] == histVector[i]) { //得到类似于Uniform的编码表:特征值j的编码值为i table[j] = i; } } } } dst = MB_LBPImage; //根据编码表得到SEMB-LBP for (int i = 0; i<dst.rows; i++) { for (int j = 0; j<dst.cols; j++) { //dst.at<uchar>(i, j):代表i,j位置的特征值 //table[dst.at<uchar>(i, j)]:代表i,j位置的特征值对应的编码值 dst.at<uchar>(i, j) = table[dst.at<uchar>(i, j)]; } } } int main() { cv::Mat src = imread("..\\..\\image\\xx.png", 0); cv::Mat dst; //getOriginLBPFeature<uchar>(src, dst); //getCircularLBPFeatureOptimization<uchar>(src, dst, 1, 8); //getRotationInvariantLBPFeature<uchar>(src, dst, 1, 8); //getUniformPatternLBPFeature<uchar>(src, dst, 1, 8); //getMultiScaleBlockLBPFeature(src, dst, 9); SEMB_LBPFeature(src, dst, 9); return 0; } 

 

 

 

小讯
上一篇 2025-01-25 23:12
下一篇 2025-04-04 20:14

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/36301.html