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 = ; r < nRows; ++r)
{
for(int c = ; c < nCols; ++c)
{
float blockValue = 0.0;
int blockSum = ;
int blockMax = ; //边缘不做考虑
if( == r || nRows - == r ||
== c || nCols - == c)
{
blockValue = ;
}
else
{
uchar v1, v2, v3, v4;
v1 = src.ptr<uchar>(r)[c];
v2 = src.ptr<uchar>(r)[c + ];
v3 = src.ptr<uchar>(r + )[c];
v4 = src.ptr<uchar>(r + )[c + ]; blockSum = v1 + v2 + v3 + v4;
blockMax = MAX(MAX(v1, v2), MAX(v3, v4));
blockValue = - blockSum*1.0/blockMax;
} bdip.ptr<uchar>(r)[c] = *blockValue;
}
} #if 1
imshow("bdip", bdip);
cvWaitKey();
#endif return;
}

BVLC code:

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

【转载自】

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

BDIP和BVLC纹理分析的更多相关文章

  1. tensorflow版的bvlc模型

    研究相关的图片分类,偶然看到bvlc模型,但是没有tensorflow版本的,所以将caffe版本的改成了tensorflow的: 关于模型这个图: 下面贴出通用模板: from __future__ ...

  2. BVLC CaffeNet可视化及类别预测

    一.介绍 bvlc_reference_caffenet网络模型是由AlexNet的网络模型改写的,输入图片尺寸大小为227x227x3,输出的为该图片对应1000个分类的概率值. 介绍参考:caff ...

  3. caffe-windows环境配置(github上官方BVLC/caffe的推荐配置方法详解)

    [转载来的文章:如有侵权,请联系我!我将马上删除!] 首先声明一下,如标题,本教程是caffe在windows系统上的配置方法,而且是github上官方BVLC/caffe目前推荐的配置方法,并不是使 ...

  4. windows10下基于docker的bvlc/caffe环境搭建与使用

    docker 安装参见docker官网,当cmd出现以下图像时安装正确; 然后进行bvlc/caffe环境创建,有两种,一种是直接pull github的bvlc,一种是本地创建image,直接使用g ...

  5. 基于英特尔® 至强™ 处理器 E5 产品家族的多节点分布式内存系统上的 Caffe* 培训

    原文链接 深度神经网络 (DNN) 培训属于计算密集型项目,需要在现代计算平台上花费数日或数周的时间方可完成. 在最近的一篇文章<基于英特尔® 至强™ E5 产品家族的单节点 Caffe 评分和 ...

  6. 基于英特尔® 至强 E5 系列处理器的单节点 Caffe 评分和训练

    原文链接 在互联网搜索引擎和医疗成像等诸多领域,深度神经网络 (DNN) 应用的重要性正在不断提升. Pradeep Dubey 在其博文中概述了英特尔® 架构机器学习愿景. 英特尔正在实现 Prad ...

  7. Caffe Python MemoryDataLayer Segmentation Fault

    转载请注明出处,楼燚(yì)航的blog,http://home.cnblogs.com/louyihang-loves-baiyan/ 因为利用Pyhon来做数据的预处理比较方便,因此在data_l ...

  8. ubuntu16.04配置py-faster-rcnn

    在ubuntu16.04下编译安装了py-faster-rcnn. 主要步骤包括:安装cuda/cudnn,换apt源,装开源显卡驱动,装caffe依赖的apt包和python包,下载py-faste ...

  9. Linux下的几个好用的命令与参数

    将所有文件的编码,转换为UTF-8 find . ! -type d -exec enca -L zh_CN -x UTF-8 {} \; 将指定目录下所有文件权限设定为644 find . ! -t ...

随机推荐

  1. ~function(){}() 和(function(){}){}

    使用~function(){}()也是声明并调用函数的方法之一: 这是一段使用~function(){}()来声明函数并调用函数的例子: ~function() { alert(typeof next ...

  2. cocos2d-x解决中文乱码问题的几种办法

    昨天改写cocos2d-x的例程,想在其基础上加上一个计分系统.没有分数实在让人没有玩下去的动力! 我在主场景上加上了一个CCLabelTTF,用于显示分数. 但是意外的发现,当内容含有中文时,CCL ...

  3. CSocket类网络编程 MFC

    Visual C++的MFC提供了CSocket类用来实现网络通信. 下面介绍VC++在Windows 95中实现Socket的 CSocket 类相关成员函数(这些成员函数实际上是从CAsyncSo ...

  4. jQuery-File-Upload文件上传

    http://blueimp.github.io/jQuery-File-Upload/index.html

  5. 如何把高版本的sqlserver 还原到低版本的 sqlserver

    本例为sql2012 还原到sql2008. 要实现的功能是把sql2012的数据库备份到sql2008,数据库名字为Test,并且这两个数据库在不同的电脑中. 微软的软件设计方案基本上都是新版本兼容 ...

  6. quartz 实现调度任务 SchedulerManager

    package cn.com.do1.component.common.util; import org.quartz.*; import org.quartz.impl.StdSchedulerFa ...

  7. android studio 报Error:failed to find Build Tools revision 23.0.0 rc2

    每个项目的build.gradle里可以设置,例如 android { .... buildToolsVersion '23.0.0 rc2' .... } 1 2 3 4 5 如下图,我的Andro ...

  8. c++深/浅拷贝 && 构造函数析构函数调用顺序练习题

    1.深/浅拷贝 编译器为我们提供的合成拷贝构造函数以及合成的拷贝赋值运算符都是浅拷贝.浅拷贝只是做简单的复制,如果在类的构造函数中new出了内存,浅拷贝只会简单的复制一份指向该内存的指针,而不会再开辟 ...

  9. .Net应该学什么怎么学(二)

    更新时间:2012年06月05日18时23分 来源:传智播客.Net 接上篇<[我来解惑].Net应该学什么怎么学(一)>. 二.C#面向对象基础 初学者学面向对象的时候没必要(也做不到) ...

  10. kubernetes master 高可用一键部署

    #地址见:https://github.com/SILLKY/kubernetes-pro/tree/master/Master-HA#包括其他一些文件,适当版本1.6.1#!/bin/bash ho ...