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 = ; 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纹理分析的更多相关文章
- tensorflow版的bvlc模型
研究相关的图片分类,偶然看到bvlc模型,但是没有tensorflow版本的,所以将caffe版本的改成了tensorflow的: 关于模型这个图: 下面贴出通用模板: from __future__ ...
- BVLC CaffeNet可视化及类别预测
一.介绍 bvlc_reference_caffenet网络模型是由AlexNet的网络模型改写的,输入图片尺寸大小为227x227x3,输出的为该图片对应1000个分类的概率值. 介绍参考:caff ...
- caffe-windows环境配置(github上官方BVLC/caffe的推荐配置方法详解)
[转载来的文章:如有侵权,请联系我!我将马上删除!] 首先声明一下,如标题,本教程是caffe在windows系统上的配置方法,而且是github上官方BVLC/caffe目前推荐的配置方法,并不是使 ...
- windows10下基于docker的bvlc/caffe环境搭建与使用
docker 安装参见docker官网,当cmd出现以下图像时安装正确; 然后进行bvlc/caffe环境创建,有两种,一种是直接pull github的bvlc,一种是本地创建image,直接使用g ...
- 基于英特尔® 至强™ 处理器 E5 产品家族的多节点分布式内存系统上的 Caffe* 培训
原文链接 深度神经网络 (DNN) 培训属于计算密集型项目,需要在现代计算平台上花费数日或数周的时间方可完成. 在最近的一篇文章<基于英特尔® 至强™ E5 产品家族的单节点 Caffe 评分和 ...
- 基于英特尔® 至强 E5 系列处理器的单节点 Caffe 评分和训练
原文链接 在互联网搜索引擎和医疗成像等诸多领域,深度神经网络 (DNN) 应用的重要性正在不断提升. Pradeep Dubey 在其博文中概述了英特尔® 架构机器学习愿景. 英特尔正在实现 Prad ...
- Caffe Python MemoryDataLayer Segmentation Fault
转载请注明出处,楼燚(yì)航的blog,http://home.cnblogs.com/louyihang-loves-baiyan/ 因为利用Pyhon来做数据的预处理比较方便,因此在data_l ...
- ubuntu16.04配置py-faster-rcnn
在ubuntu16.04下编译安装了py-faster-rcnn. 主要步骤包括:安装cuda/cudnn,换apt源,装开源显卡驱动,装caffe依赖的apt包和python包,下载py-faste ...
- Linux下的几个好用的命令与参数
将所有文件的编码,转换为UTF-8 find . ! -type d -exec enca -L zh_CN -x UTF-8 {} \; 将指定目录下所有文件权限设定为644 find . ! -t ...
随机推荐
- Executor , ExecutorService 和 Executors
三者的主要区别和关系如下: Executor 和 ExecutorService 这两个接口主要的区别是:ExecutorService 接口继承了 Executor 接口,是 Executor 的子 ...
- ny168 房间安排
房间安排 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 2010年上海世界博览会(Expo2010),是第41届世界博览会.于2010年5月1日至10月31日期间,在中 ...
- 09、win32 转换为 store app
1.机制: 微软的 Project Centernial ( Project C) 项目的就是把传统的 windows桌面应用程序 转换为 windows10 store app (appx). 目的 ...
- Django视图层之路由配置系统(urls)
视图层之路由配置系统(urls) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个U ...
- windows 7/mac编译cocos2d-x-3.2*的android工程报错
开始学习cocos2d-x-3.* 凭着对2.*的各个版本的认识和升级的经验,本以为直接用最新的3.2rc0版本练手应该没有问题,结果一上来就是一个大坑.你妹! Android NDK: Invali ...
- nginx正向代理http(一)
nginx实现正向代理,下面以http为例说明: (1)nginx配置: server { listen 8080; resolver 114.114.114.114; access_log logs ...
- svn 版本导致
Malformed network data svn: Unable to parse URL '/svn/PROJECT/13.深大出版社/trunk/sdcbs/' svn 版本导致 1 ...
- Jar/War/Ear等包的作用与区别详解
以客户角度来看,jar文件就是一种封装格式,用户不需要知道jar包中有多少个.class格式的文件及每个文件中的功能与作用,也可以得到相应的访问的结果.java中除了jar格式还有war和ear等包文 ...
- iostbleView刷新后显示指定cell
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_q ...
- Android笔记(十一)第一个Fragment
Fragment是碎片的意思,能够參照Activity来理解Fragment,由于它们都能包括布局,都有自己的生命周期. 以下我们要让主活动包括两个碎片,而且让两个碎片充满屏幕 1.首先,新建两个碎片 ...