计算分形盒子维

//************************//
//计算分形盒子维
//*** yangxin_szu 2013_03_28 ***//
//valarray与 MFC 有一定冲突
//#undef的使用是为了避免问题出现
#ifdef min
#undef min
#endif
#ifdef max
#undef max
#endif
#include <valarray>
using namespace std;
void Calculate_Fractal_Dim(unsigned char* Img_Data, int Img_size, double& kx, double& b)
{//*************************************************////the width and height of the Image should be the same//gray level : 256//points for Least Square method: 20//*************************************************//int i = 0, j = 0;//分形盒子维相关参数int M = Img_size;//图像尺寸int G = 256;//图像灰度级int L_point = 20;//最小二乘法样本点数valarray<unsigned char> Img_VAL(Img_size*Img_size);valarray<int> L_VAL(L_point);valarray<int> h_VAL(L_point);valarray<double> r_VAL(L_point);valarray<double> Nr_VAL((double)0, L_point);valarray<int> Grid_Num(L_point);//网格数目valarray<double> fractal_D(0.0, L_point);//复制数据int k = 0;for (i = 0; i < Img_size; i++){for (j = 0; j < Img_size; j++){Img_VAL[k] = Img_Data[i*Img_size + j];k++;}}//网格大小及相关参数//改进后的约束范围 M^(1/3)<= L <= M/3int L_min = (int)powf(M, 1 / 3.0);//int L_min = M/40;int L_max = (int)M / 2;int L_step = (int)((L_max - L_min) / (float)L_point);for (i = 0; i < L_point; i++){L_VAL[i] = L_min + i * L_step;//各样本点对应的网格大小     Lh_VAL[i] = (G*L_VAL[i]) / M;  //各样本点对应的盒子高度     hr_VAL[i] = log10(1 / (L_VAL[i] / (float)M));//各样本点对应的 rGrid_Num[i] = M / L_VAL[i];//各样本点对应的图像网格数目    Num}int m = 0, n = 0, t = 0;int grid_lt_x = 0, grid_lt_y = 0, grid_rd_x = 0, grid_rd_y = 0;unsigned char grid_I_max = 0, grid_I_min = 0;int dbc_l = 0, dbc_k = 0, nr = 0;int s = 0, p = 0, q = 0, box_non_zero = 0, box_zero_count = 0;int gray_k = 0, gray_l = 0;//计算 Nrfor (k = 0; k < L_point; k++){//临时存储单个网格数据valarray<unsigned char> grid_img((unsigned char)0, L_VAL[k] * L_VAL[k]);for (m = 0; m < Grid_Num[k]; m++){for (n = 0; n < Grid_Num[k]; n++){//单个网格的坐标范围grid_lt_x = n * L_VAL[k];grid_lt_y = m * L_VAL[k];grid_rd_x = grid_lt_x + L_VAL[k] - 1;grid_rd_y = grid_lt_y + L_VAL[k] - 1;//复制数据t = 0;for (i = grid_lt_y; i < grid_rd_y; i++){for (j = grid_lt_x; j < grid_rd_x; j++){grid_img[t] = Img_Data[i*M + j];t++;}}grid_I_min = grid_img.min();grid_I_max = grid_img.max();//最小、最大灰度所在的网格高度dbc_k = grid_I_min / h_VAL[k];dbc_l = grid_I_max / h_VAL[k];//*******计算空盒子数目********//for (s = dbc_k; s <= dbc_l; s++){//灰度上下限gray_k = s * h_VAL[k];gray_l = gray_k + h_VAL[k] - 1;//清零box_non_zero = 0;//落在指定盒子内的点数for (p = 0; p < t - 1; p++){if ((grid_img[p] >= gray_k) && (grid_img[p] <= gray_l))box_non_zero++;}//空盒子if (box_non_zero == 0)box_zero_count++;}//Nr累加并剔除空盒子nr = dbc_l - dbc_k + 1 - box_zero_count;Nr_VAL[k] = Nr_VAL[k] + nr;//清零box_zero_count = 0;}}Nr_VAL[k] = log10(double(Nr_VAL[k]));//grid_img.free();}//计算各样本点对应的理论斜率并保存fractal_D = Nr_VAL / r_VAL;//ofstream outfile("F:\\Fractal_D.txt");//打开文件,准备写入for (j = 0; j < L_point; j++){//cout << fractal_D[j] << ' ' << endl;//距离}//cout << endl;//outfile.close();//关闭文件,完成写入//****************************************////最小二乘法拟合直线double A = 0.0;double B = 0.0;double C = 0.0;double D = 0.0;A = (r_VAL*r_VAL).sum();B = r_VAL.sum();C = (r_VAL*Nr_VAL).sum();D = Nr_VAL.sum();double fractal_k, fractal_b, tmp = 0;if (tmp = (A*L_point - B * B)){fractal_k = (C*L_point - B * D) / tmp;fractal_b = (A*D - C * B) / tmp;}else{fractal_k = 1;fractal_b = 0;}kx = fractal_k;b = fractal_b;
}

调用方法

Mat src;double k, b;src = cv::imread("1.bmp");cvtColor(src, src, CV_BGR2GRAY);threshold(src, src, 128, 255, CV_THRESH_BINARY);unsigned char* Small = src.data;Calculate_Fractal_Dim(Small, 314, k, b);
cout<<k<< b<<endl;//或转换string显示:to_string(k);

注:

1.本方案原意是用来评估一个只有白色点轮廓(黑色背景)的图像中白色轮廓的分布均匀程度。
2.如果各个轮廓的分布足够均匀,则,计算的盒维数中K值月接近2.0;
3.计算要求输入图像是正方形;
4.原始代码是从网上下载,选优对输入图像做适当转换之后才可以使用;
5.计算结果,理论要求是拟合成一条一次曲线y=kx+b;其各个数据分布在直线附近。越均匀越接近在直线附近。


http://www.taodudu.cc/news/show-1639511.html

相关文章:

  • OpenCV图像处理(4)——去除小面积
  • OpenCV图像处理(6)——轮廓标记
  • OpenCV图像处理(7)——图像上写TEXT
  • C++ 常见错误(00) —— C#调用c++做的dll是报错
  • C++ 常见错误(01) —— error LNK1104: 无法打开文件“avcodec.lib”
  • (1)癌症
  • C++ 常见错误(02) —— 将dll(用c++写的)处理的结果展示在界面上
  • C++ 常见错误(03) —— cout输出图像路径
  • OpenCV图像处理(9)——边缘提取方法对比
  • C++ 配置笔记
  • 深度学习(01)——安装anaconda
  • 深度学习(00)——GPU版本的TensorFlow
  • (0)图像处理界面——C#调用C++图像处理的DLL
  • OpenCV图像处理(12)——保存图像到指定位置
  • (0)C#开发环境构建——史上最容易理解的C#界面搭建
  • OpenCV图像处理(13)——指定区域截取和指定区域复制
  • (1)非对称加密
  • (1)非对称加密——RSA——史上最通俗的小白可看懂!
  • OSG仿真案例(7)——osg自动驾驶
  • OpenCV图像处理(14)——文件夹下所有图像转灰度
  • OSG仿真案例(8)——读取FBX格式文件并显示(无动画)
  • OSG仿真案例(9)——JY61陀螺仪控制飞机姿态
  • who I am ?
  • OSG仿真案例(10)——osg仿真录屏抓取图像,自定义修改路径,程序控制(而不是按键控制)...
  • C++相对路径下新建文件夹
  • OpenCV图像处理(14)—— 图像转视频
  • OpenCV图像处理(18)——文件夹下所有图像转灰度(14-15综合)
  • OpenCV图像处理(17)—— 各种二值化对比
  • 真正的研发之路(1)
  • (2)Mac安装Parallels无法上网

OpenCV图像处理(3)——盒维数计算相关推荐

  1. 差分盒维数的计算方法

    差分盒维数(differential box-counting,DBC),可以作为图像表面纹理粗糙程度的度量,因为它有很好的精确性和适用性,而且能满足计算效率和动态特性的要求. 处理流程: 对于一个M ...

  2. OpenCV图像处理(2)——形态学操作

    形态学操作 Mat element = getStructuringElement(MORPH_RECT, Size(9, 9)); morphologyEx(InputImage, OutputIm ...

  3. OpenCV图像处理(1)——指定文件夹写入图像

    文件夹写入图像 imwrite("./111/maoqiubiaozhu_" + std::to_string(i) + ".bmp", src);//在项目目 ...

  4. OpenCV图像处理(0)——文件夹批量读取文件

    读取文件夹下所有图像.jpg string file_path = "H:\\图像处理模板\\c++\\CmakeBuildOpenCVPrj\\Pic\\PillingImages\\Si ...

  5. matlab盒子分形维数_分形:盒子维数

    今天主要想说的是,分形中的差分盒子维数的原理,基于分形的基础概念就不在这里说啦. 分形维数可以用于定量描述图像表面的空间复杂程度,能够定量的表现图像的纹理特征. 采用不同的维数进行纹理特征描述时,精度 ...

  6. HOG参数简介及Hog特征维数的计算

    HOG构造函数 CV_WRAP HOGDescriptor() :winSize(64,128), blockSize(16,16), blockStride(8,8),      cellSize( ...

  7. C语言 二维数组行数和列数计算 - C语言零基础入门教程

    目录 一.计算一维数组长度 二.计算二维数组长度 1.二维数组行数 2.二维数组列数 3.二维数组的元素个数 = 二维数组行数 * 二维数组列数 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C ...

  8. JavaCV进阶opencv图像处理:10行代码快速实现扫描识别图片中的二维码

    人脸检测识别 javacv进阶opencv图像检测/识别系列目录 人脸检测识别 JavaCV进阶opencv图像处理:摄像头图像人脸检测 JavaCV进阶opencv图像处理:ffmpeg视频图像画面 ...

  9. c语言中二维数组中维数的计算,数组指针字符串C语言程序设计-第4章.ppt

    <数组指针字符串C语言程序设计-第4章.ppt>由会员分享,可在线阅读,更多相关<数组指针字符串C语言程序设计-第4章.ppt(132页珍藏版)>请在人人文库网上搜索. 1.程 ...

最新文章

  1. 一张自拍变6种风格漫画,视频也支持,全程稳定不“掉线”,这个AI不到一天狂揽1800赞...
  2. 使用Keras进行深度学习:(二)CNN讲解及实践
  3. C++ stringstream的用法
  4. Liunx文件的属性(权限) 超详细解析
  5. Bootstrap HTML 编码规范之布尔型属性
  6. Thinking in C++ ----第二章 对象的创建和使用
  7. 浅析CSDN的下载积分
  8. 遗传算法matlab_通俗易懂地解释遗传算法
  9. [闲聊篇]这个世界所谓的28定律
  10. 十个英文原版电子书下载网站(无需翻墙)
  11. C语言学习:一个函数可以有几个返回值?
  12. MATLAB基于形态学的目标检测(一)简单图形统计
  13. 加入中视频计划赚钱吗?你还别不信收益确定高
  14. pat 1027. Colors in Mars (20)
  15. 设计一个不浪费水的热水器
  16. mysql sin度数正玄值_JavaScript用Math.sin()求正弦值
  17. 二次型哈密顿量的矩阵对角化方法
  18. 27.大数据学习之旅——SparkStreamingspark mllib数据挖掘与机器学习
  19. oracle添加索引指定表空间,Oracle 创建索引表空间语法-oracle
  20. FL Studio20效果器Fruity Reverb 2功能介绍

热门文章

  1. [paper reading] RetinaNet
  2. [paper reading] Faster RCNN
  3. 一个demo学会java
  4. 一句话满速下载清华源3.4.1.15版本的opencv和contrib库
  5. linux aix 环境,在AIX中设置中文环境
  6. 圣诞节的整理前两周的内容4
  7. node 创建静态web服务器(上)
  8. java并发编程工具类辅助类:CountDownLatch、CyclicBarrier和 Semaphore
  9. 巧用编辑器正则表达式,批量修改删除超链接
  10. MySQL课堂练习 20162315