BDIP-BVLC纹理

来源:互联网 发布:代理商域名转到阿里云 编辑:程序博客网 时间:2024/06/14 14:02

BDIP&BVLC介绍

  • BDIP(block difference of inverse probabilities),基于块的逆转概率(私以为很拗口,翻译不佳),描述了在一个M*M大小的块内,像素值变化的快慢,计算的BDIP值越大,原图像像素值变化越剧烈。
  • BVLC(block-based of variation of local correlation coefficients),基于块的局部相关系数,描述了一个像素点与周围四个方向(-90, 0, -45, 45)的相关度,计算的BVLC值越大,原图像越粗糙。
  • BDIP&BVLC特征图的特征描述子可见文末附带文献。

BDIP&BVLC计算方法

BDIP

BDIP计算公式

  • I(i, j)表示属于M*M块中某一个像素值

BVLC

BVLC计算公式1

这里写图片描述

  • k,l分别表示水平和垂直移动 ,I(i, j)表示属于M*M块中某一个像素值,O(4)表示四个平移方向
    σ(k,l)表示在平移后M*M像素块里的标准差 ,σ(0,0)表示当前M*M块的标准差
    μ(k,l)表示在平移后M*M像素块里的均值 ,μ(0,0)表示当前M*M块的均值
    这里写图片描述
  • 像素平移示意图

实现

(1)BDIP

void bdip(const Mat& src){    Mat bdip;    bdip = src.clone();    int nRows;    int nCols;    nRows = src.rows;    nCols = src.cols;    //计算bdip特征图    for(int r = 0; r < nRows; ++r)    {        for(int c = 0; c < nCols; ++c)        {            float blockValue = 0.0;            int blockSum = 0;            int blockMax = 0;            //边缘不做考虑            if(0 == r || nRows - 1 == r ||                0 == c || nCols - 1 == c)            {                blockValue = 0;            }            else            {                uchar v1, v2, v3, v4;                v1 = src.ptr<uchar>(r)[c];                v2 = src.ptr<uchar>(r)[c + 1];                v3 = src.ptr<uchar>(r + 1)[c];                v4 = src.ptr<uchar>(r + 1)[c + 1];                blockSum = v1 + v2 + v3 + v4;                blockMax = MAX(MAX(v1, v2), MAX(v3, v4));                blockValue = 4 - blockSum*1.0/blockMax;            }            bdip.ptr<uchar>(r)[c] = 64*blockValue;        }    }#if 1    imshow("bdip", bdip);    cvWaitKey(0);#endif    return;}

(2)BVLC

struct  SHIFTDIRECTION{    int x;    int y;};const SHIFTDIRECTION shift[5] = {0, 0, 1, 0, 0, 1, 1, 1, 0, 1};void bvlc(const Mat& src){    int nRows;    int nCols;    nRows = src.rows;    nCols = src.cols;    //填充边界    Mat tmp;    copyMakeBorder(src, tmp, 2, 2, 2, 2,BORDER_REFLECT);    tmp.convertTo(tmp, CV_32FC1, 1.0, 0);    Mat bvlc;    bvlc = src.clone();    //计算blvc特征图    for(int r = 2; r < nRows + 2; ++r)    {        for(int c = 2; c < nCols + 2; ++c)        {            float variance[5] = {0.0};            float mean[5] = {0.0};            float value[4] = {0,0};            for(int i = 0; i < 5; ++i)            {                int curR = r + shift[i].x;                int curC = c + shift[i].y;                //计算平移后四个像素均值、方差                if(i < 4)                {                    mean[i] =                         tmp.ptr<float>(curR)[curC] +                         tmp.ptr<float>(curR + 1)[curC] +                        tmp.ptr<float>(curR)[curC + 1] +                         tmp.ptr<float>(curR + 1)[curC + 1];                    mean[i] /= 4;                    variance[i] =                         pow((tmp.ptr<float>(curR)[curC] - mean[i]), 2) +                         pow((tmp.ptr<float>(curR + 1)[curC] - mean[i]), 2) +                         pow((tmp.ptr<float>(curR)[curC + 1] - mean[i]), 2) +                         pow((tmp.ptr<float>(curR + 1)[curC + 1] - mean[i]), 2);                }                //最后一个块的位置方向与前三块有区别                else                {                    mean[i] =                         tmp.ptr<float>(curR)[curC] +                         tmp.ptr<float>(curR - 1)[curC] +                        tmp.ptr<float>(curR)[curC + 1] +                         tmp.ptr<float>(curR - 1)[curC + 1];                      mean[i] /= 4;                    variance[i] =                         pow((tmp.ptr<float>(curR)[curC] - mean[i]), 2) +                         pow((tmp.ptr<float>(curR - 1)[curC] - mean[i]), 2) +                         pow((tmp.ptr<float>(curR)[curC + 1] - mean[i]), 2) +                         pow((tmp.ptr<float>(curR - 1)[curC + 1] - mean[i]), 2);                }                variance[i] /= 4;                variance[i] = sqrt(variance[i]);            }               //计算四个方向块与原块的相关系数value[i]            for(int i = 1; i < 5; ++i)            {                   value[i - 1] =                     tmp.ptr<float>(r)[c]*tmp.ptr<float>(r + shift[i].x)[c +shift[i].y] - mean[0]*mean[i] +                    tmp.ptr<float>(r + 1)[c]*tmp.ptr<float>(r + shift[i].x)[c +shift[i].y] - mean[0]*mean[i] +                    tmp.ptr<float>(r)[c + 1]*tmp.ptr<float>(r + shift[i].x)[c +shift[i].y] - mean[0]*mean[i] +                    tmp.ptr<float>(r + 1)[c + 1]*tmp.ptr<float>(r + shift[i].x)[c +shift[i].y] - mean[0]*mean[i];                value[i - 1] /= 4;                value[i - 1] /= (variance[0]*variance[i]);            }            //获取最大和最小相关系数            float max = value[0];            float min = value[0];            for(int i = 0; i < 4; ++i)            {                if(value[i] > max)                {                    max = value[i];                }                if(value[i] < min)                {                    min = value[i];                }            }            //计算BLVC数值            bvlc.ptr<uchar>(r - 2)[c - 2] = max - min;        }    }#if 1    imshow("bvlc", bvlc);    waitKey(0);#endif    return;}

结果

  • 原始图像:
    原始图像

  • BDIP&BVLC:
    BDIP BVLC

引用

Image retrieval using BDIP and BVLC moments