• BDIP和BVLC纹理分析


    Young Deok Chun 等人提出了基于 BVLC 矩和 BDIP 矩的一种纹理分析方法。BVLC 能显示粗糙和光滑特性,BDIP 能够很好的提取波谷和边缘。它们直接在彩色空间上进行处理,能有效的结合颜色特征。

    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值越大,原图像越粗糙。


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


    四个方向位移。

    像素平移示意图:

     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块的均值 

     


     BDIP code:

    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;
    }
    View Code

    BVLC code:

    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;
    }
    View Code

    【转载自】

    BDIP-BVLC纹理 - xxxxyxxxx的博客 - CSDN博客 https://blog.csdn.net/xxxxyxxxx/article/details/76358491

    Image retrieval using bdip and bvlc moments_百度学术 http://xueshu.baidu.com/usercenter/paper/show?paperid=6fe4e1826e57f7007558cb9414214fd3&site=xueshu_se

  • 相关阅读:
    容器化的Apache服务并监控
    Jenkins配置报告与邮件插件
    Jmeter(二十八)_Docker+Jmeter+Gitlab+Jenkins+Ant(容器化的接口自动化持续集成平台)
    Jmeter(二十二)_jenkins配置gitlab插件与ant插件
    Jmeter(二十二)_脚本上传Gitlab
    Jmeter(二十七)_Beanshell保存响应内容到本地
    Jmeter(二十六)_数据驱动测试
    IT实用技术资源整理
    Jmeter(二十五)_Xpath关联
    Jmeter(二十四)_服务器性能监控
  • 原文地址:https://www.cnblogs.com/wxl845235800/p/10483785.html
Copyright © 2020-2023  润新知