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

今天主要想说的是,分形中的差分盒子维数的原理,基于分形的基础概念就不在这里说啦.

分形维数可以用于定量描述图像表面的空间复杂程度,能够定量的表现图像的纹理特征. 采用不同的维数进行纹理特征描述时,精度有所区别,我们今天主要来说一下比较简单的盒子维.


1.差分盒子维数

Gangepain 和 Roques-Carms 在1986年提出基于盒计数(Box-counting)的分形维数,通过计算覆盖图像表面的最小盒子数来度量.

说得详细一点:将一幅大小为

的图像分为
的子块,图像
处的灰度值为
,总的灰度级为
. 此时将图像看成三维物体的表面灰度集
.
平面上是
的网格,
轴为网格内像素灰度值,每个网格上有若干个盒子叠加,盒子高度为
.
注:一般灰度图像的灰度级为 L = 256.

若在第

个网格中,第
个盒子中包含网格内灰度最小值,第
个盒子包含网格内灰度最大值,则覆盖第
个网格的盒子数
.

覆盖整个盒子的数为

为:

由此可求分形维数D为:

式中:

.

通过改变网格

的大小计算一组
,然后计算点对
的线性回归,其斜率即是分形维数
.

2.实验

我们先来看一下,将灰度图像看作三维物体的表面灰度集是怎么样呢?

① 实现灰度图像的表面灰度集,采用matlab程序,如下:

function Show_GraySurface(filename)%   把一幅图像看成三维空间的曲面,
%   像素的位置(x,y)构成xoy坐标面,
%   像素的灰度值看成z轴的值由此构成灰度曲面picture_dir = 'D:Matlabworktest';I = imread([picture_dir,filename]);if (length(size(I)) > 2)I = rgb2gray(I);end M = size(I,1);Temp = diag(1:256)*ones(256,256);x = reshape(Temp.',1,M*M);y = reshape(Temp,1,M*M);z = reshape(I,1,M*M);tri = delaunay(x,y);trisurf(tri,x,y,z);shading interpview(3);grid on;colorbarend

附加:python程序

import cv2
import numpy as np
import matplotlib.pyplot as pltdef surface(img):X = np.arange(0, 363, 1) # cols of the imageY = np.arange(0, 480, 1) # rows of the imageX,Y = np.meshgrid(X,Y)   # extending pointsZ = np.array(img)      #2 dimensionfig, ax = plt.subplots(subplot_kw = {"projection": "3d"})surf = ax.plot_surface(X, Y, Z, cmap = "rainbow", linewidth = 0, antialiased = False)ax.contour(X, Y, Z, zdir = 'z', offset = 75, cmap = plt.get_cmap('rainbow'))  # projectionfig.colorbar(surf)  # colorbarplt.show()if __name__ == "__main__":img = cv2.imread("3.jpg", 0)surface(img)
注:matlab程序中,图像大小256 x 256.

效果如下:

d9b101a42ffb3feb7c21ba3a67ac45eb.png
图1 图像灰度曲面

② 计算差分盒维数,采用Python程序.

★ 主程序文件:main.py

import cv2
from DBC import Fractalsrc = cv2.imread("D5.jpg", cv2.IMREAD_UNCHANGED)# create an object
obj = Fractal()#linear fitting for solveing differential box dimension(DBC)
obj.execute(src)

★ 子程序文件:DBC.py

import numpy as np
import cv2
import math
from matplotlib import pyplot as pltclass Fractal():def __init__(self):pass# method of image grayingdef gray(self, src):gray_img = np.uint8(src[:,:, 0] * 0.144 + src[:, :, 1] * 0.587 + src[:, :, 2] * 0.299)    # cla_img = cv2.bilateralFilter(gray_img, 3, 64, 64)# #clahe processing# clahe = cv2.createCLAHE(clipLimit = 3, tileGridSize = (32, 32))# cla_img = clahe.apply(bil_img)return gray_img#  differential box dimension counting (DBC)def differential_box_counting (self, gray_img):h, w = gray_img.shape[:2]M = min(h,w)Nr = []for s in range(2,M//2+1,1):         # the box side length: 2 ~ M//2H = 255*s/M                     # high of the boxbox_num = 0                     # initialization of the box numberfor row in range(h//s):         # h//s: the number of rows in the box;  w//s: the number of columns in the boxfor col in range(w//s):nr = math.ceil((np.max(gray_img[row*s:(row+1)*s, col*s:(col+1)*s])-np.min(gray_img[row*s:(row+1)*s, col*s:(col+1)*s]))/H +1)box_num += nrNr.append(box_num)return Nr,Mdef least_squares(self, x , y):"""(1) input datesets of x and y (2) the straight line is fitted by Least-square method(3) output a coefficient(w), intercept(b) and coefficient of determination (r)(4) the fitting straight line : y = wx + b"""x_ = x.mean()y_ = y.mean()m1 = np.zeros(1)m2 = np.zeros(1)m3 = np.zeros(1)  k1 = np.zeros(1)k2 = np.zeros(1)k3 = np.zeros(1)for i in np.arange(len(x)):m1 += (x[i] - x_)* y[i]m2 += np.square(x[i])m3 += x[i]k1 += (x[i]-x_) * (y[i]-y_)k2 += np.square(x[i] - x_)k3 += np.square(y[i] - y_)w = m1/(m2 - 1/len(x) * np.square(m3))b = y_ - w * x_r = k1 / np.sqrt(k2 * k3)return w, b, rdef plot_line(self, x, y, w, b, r):# print(w, b, r ** 2)y_pred = w * x + b# create a fig and an axesfig, ax = plt.subplots(figsize = (10, 5))# fontsyle: SimHei(黑体),support chineseplt.rcParams['font.sans-serif'] = ['SimHei']ax.plot(x, y, 'co', markersize = 6, label = 'scatter datas')ax.plot(x, y_pred, 'r-', linewidth = 2, label = 'y = %.4fx + %.4f' %(w, b))# set xlim and yxlim ax.set_aspect("0.5")ax.set_xlim(1, 6)ax.set_ylim(2, 12)# set x_ticks and y_ticksax.tick_params(labelsize = 16)labels = ax.get_xticklabels() + ax.get_yticklabels()[label.set_fontname('Times New Roman') for label in labels] # create gridsax.grid(which = "major", axis = "both")# display labelsfont1 = {'family': 'Times New Roman', 'weight': 'normal', 'size': 16}ax.legend(prop = font1) #set x_label and y_labelfont2 = {'family': 'Times New Roman', 'weight': 'normal', 'size': 20}ax.set_xlabel("ln 1/r", fontdict = font2)ax.set_ylabel("ln Nr", fontdict = font2)# set a position of "R^2"ax.text(3.5, 7.8, 'R^2 = %.4f' % float(r * r), fontdict = font1,verticalalignment='center', horizontalalignment ='left', rotation=0)plt.savefig("line.jpg", dpi = 300, bbox_inches = "tight")plt.show()def execute(self, img):gray_img = self.gray(img)Nr, M = self.differential_box_counting(gray_img)x = np.log([round(M/s) for s in range(2,M//2+1,1)])y = np.log(Nr)#fitting a straight linew, b, r = self.least_squares(x, y)self.plot_line(x, y, w, b, r)

我们来看一下效果图:用最小二乘法进行拟合,斜率就是我们需要的维数.

faf2f9e03a936d76fa21cac5d65cd43a.png
图2 线性拟合
# 其实最小二乘法,也可以通过sklearn库直接调用.import cv2
import numpy as np
import math
from matplotlib import pyplot as plt
from sklearn import linear_model
from sklearn.metrics import r2_scorefrom numba import jit@jit
def differential_box_counting (gray_img):# cv2.imshow("gray_img",gray_img)h, w = gray_img.shape[:2]M = min(h,w)Nr = []for s in range(2,M//2+1,1):         #盒子边长从2到图片最小尺寸的二分之一,每次边长加1H = 255*s/M        #盒子柱高lbox_num = 0         #初始化盒子数for row in range(h//s):           #(h//s)为盒子的行数,(w//s)为盒子的列数for col in range(w//s):nr = math.ceil((np.max(gray_img[row*s:(row+1)*s, col*s:(col+1)*s])-np.min(gray_img[row*s:(row+1)*s, col*s:(col+1)*s]))/H +1)box_num += nrNr.append(box_num)return Nr,Mdef Least_squares():x = np.log([round(M/s) for s in range(2,M//2+1,1)])x = np.array(x).reshape((-1, 1))  # transform list to numpy.ndarrayy = np.log(Nr)y = np.array(y).reshape((-1, 1))  # transform list to numpy.ndarray# Create linear regression objectregr = linear_model.LinearRegression()  # is equivalent to  # regr = linear_model.Ridge(alpha = 0)# Train the model using the setsregr.fit(x, y)y_pred = regr.predict(x)# The coefficientsprint('Coefficients:   ', regr.coef_)#The interceptprint('Intercept:  ', regr.intercept_)# The coefficient of determination: 1 is perfect predictionprint('Coefficient of determination: %.8f'% r2_score(y, y_pred))plt.scatter(x, y,  color='black')plt.plot(x, y_pred, color='blue', linewidth=3)plt.show()if __name__ == "__main__":gray_img = cv2.imread("D3.jpg", cv2.IMREAD_GRAYSCALE)# thresh = cv2.threshold(gray_img, 220, 255, cv2.THRESH_BINARY)[1]Nr,M = differential_box_counting(gray_img)Least_squares()

喜欢的话,给予鼓励,点个赞...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/news/328582.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Eclipse中看不到jsp的页面效果

转载自 Eclipse中看不到jsp的页面效果eclipse打开jsp后,在文件下面部分应该有”design"视图的,你点击一下看看。还是没有的话,在JSP文件上点点右键,"open with"选"webpage editor",然后下面应该有“des…

唤醒幻数据包禁用会怎么样_如何利用splashtop实现远程开机、远程唤醒电脑

Splashtop商业版和个人版提供了局域网唤醒计算机(WoL)功能,您可以按照下面的指引进行设置。首先,请确保完全满足以下三个条件,否则,远程唤醒无法工作。计算机 BIOS支持WoL并且该选项已启用。Windows或Mac计算机的操作系统中已正确…

第二篇:Dapper中的一些复杂操作和inner join应该注意的坑

上一篇博文中我们快速的介绍了dapper的一些基本CURD操作,也是我们manipulate db不可或缺的最小单元,这一篇我们介绍下相对复杂 一点的操作,源码分析暂时就不在这里介绍了。 一:table sql 为了方便,这里我们生成两个表…

eclipse安装、使用hibernate插件方法

转载自 eclipse安装、使用hibernate插件方法hibernate插件安装方法: http://download.jboss.org/jbosside/updates/stable 点击eclipse的help菜单里的“Install New Software”点击“Add”,输入下面的内容,一路“NEXT”即可 hibernate更新网…

编译内核_将驱动编译进内核(Kernel)的步骤记录

1、首先在/kernel/drivers下建立驱动文件;以建立hello文件为例2、在hello文件下创建.c/Makefile/Kconfig三个文件3、.c文件存放驱动程序;Makefile存放编译的方法;Kconfig存放编译的配置4、Makefile格式例如:“ obj-$(CONFIG_HELLO…

项目的提交

git status git add . git status git commit -am project init -a是提交 m是message放后面 git push git branch 完成了代码提交

Visual Studio “15”的第四个预览版发布

在Visual Studio “15”(VS15)首批披露的细节中,其中一个是围绕着VS15的安装过程。VS在年复一年地添加着各种功能,这导致占用了更多磁盘空间,并且安装需要更长时间。Microsoft为缩短开发人员的VS15软件安装时间&#x…

Eclipse 内置浏览器

转载自 Eclipse 内置浏览器Web 浏览器Eclipse 系统内部自带了浏览器,该浏览器可以通过点击 Window 菜单并选择 Show View > Other,在弹出来的对话框的搜索栏中输入 "browser"。在树形菜单中选择 "Internal Web Browser" 并点击…

gpu超算算法_超算安装GPU-based软件 (以pytorch为例)

一般的超算的拓扑结构是若干个登陆节点若干个交换机大量计算CPU节点大量GPU计算节点一个(或若干个)存储节点管理节点。其中存储节点的共享存储可以被所有节点访问。一般运作方式是,如果我的计算依赖非常共性的软件,我可以找超算管理员安装,使…

2017最新顺口溜出炉(超级经典)!

来源:素材来自网络 编辑:青年文学精选 转载须注明以上信息 感情 多情是傻, 无情最酷, 痴情是蠢, 绝情是懂得世故。 说钱 最有钱的在北京, 最爱钱的在深圳, 最花钱的在广州&#xff…

先定个小目标, 使用C# 开发的千万级应用

话说昨天的港股发生了一件大事,腾讯成为亚洲市值最高的公司,在这历史性的一刻,作为在鹅厂工作的C# 程序员,也应该让世人了解下C# 并不是那么没有市场。在鹅厂,代码构成中60%以上是C, C#也有10%左右的份额,后…

用eclipse创建动态web项目手动生成web.xml方法

转载自 用eclipse创建动态web项目手动生成web.xml方法今天在学习JSP时先创建了一个web项目,后来在用到web.xml文件时,才发现项目创建时更本就没有自动创建web.xml文件,由于我今天第一次接触这个动态web的学习,所以也没有刻意拷贝…

python3.0什么时候发布的_Django 3.0 发布说明

Python兼容性Django 3.0 仅支持Python 3.6, 3.7和3.8,而且仅支持每个系列里的最新版本。而Django 2.2.x是最后的支持Python 3.5的版本。Django官方已经建议第三方应用开发者放弃兼容Django2.2之前的版本,并给出了操作指南。Django 3.0的新特性支持MariaD…

使用Session防止表单重复提交

转载自 JavaWeb学习总结(十三)——使用Session防止表单重复提交在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表…

如果你也会C#,那不妨了解下F#(5):模块、与C#互相调用

F# 项目 在之前的几篇文章介绍的代码都在交互窗口(fsi.exe)里运行,但平常开发的软件程序可能含有大类类型和函数定义,代码不可能都在一个文件里。下面我们来看VS里提供的F#项目模板。 F#项目模板有以下几种类型(以VS20…

用户模块开发 分类模块 商品模块 购物车模块

分类表 https://openhome.alipay.com/platform/appDaily.htm?tabaccount 沙箱 沙箱环境使用说明 https://docs.open.alipay.com/200/105311 https://docs.open.alipay.com/200/105311 当面付 app都有文档在最下面 https://docs.open.alipay.com/204/105297 app集成文…

hbase 单机连接hadoop_Hadoop、Hbase单机环境安装

1. Hadoop安装1.1 HDFS配置fs.defaultFShdfs://localhost:9000hadoop.tmp.dirfile:/home/local/data/hadoop/tmpdfs.replication1dfs.namenode.name.dirfile:/home/local/data/hadoop/tmp/dfs/namedfs.datanode.data.dirfile:/home/local/data/hadoop/tmp/dfs/data编辑Hadoop下…

高效的SQLSERVER分页查询

Sqlserver数据库分页查询一直是Sqlserver的短板,闲来无事,想出几种方法,假设有表ARTICLE,字段ID、YEAR...(其他省略),数据53210条(客户真实数据,量不大),分页查询每页30条,查询第1500页&#xf…