Sim*_*mon 7 python numpy image-processing fractals
我有一些图像,我想要计算Minkowski /盒计数维度,以确定图像中的分形特征.这是2个示例图像:
10.jpg:
24.jpg:
我正在使用以下代码来计算分形维数:
import numpy as np
import scipy
def rgb2gray(rgb):
r, g, b = rgb[:,:,0], rgb[:,:,1], rgb[:,:,2]
gray = 0.2989 * r + 0.5870 * g + 0.1140 * b
return gray
def fractal_dimension(Z, threshold=0.9):
# Only for 2d image
assert(len(Z.shape) == 2)
# From https://github.com/rougier/numpy-100 (#87)
def boxcount(Z, k):
S = np.add.reduceat(
np.add.reduceat(Z, np.arange(0, Z.shape[0], k), axis=0),
np.arange(0, Z.shape[1], k), axis=1)
# We count non-empty (0) and non-full boxes (k*k)
return len(np.where((S > 0) & (S < k*k))[0])
# Transform Z into a binary array
Z = (Z < threshold)
# Minimal dimension of image
p = min(Z.shape)
# Greatest power of 2 less than or equal to p
n = 2**np.floor(np.log(p)/np.log(2))
# Extract the exponent
n = int(np.log(n)/np.log(2))
# Build successive box sizes (from 2**n down to 2**1)
sizes = 2**np.arange(n, 1, -1)
# Actual box counting with decreasing size
counts = []
for size in sizes:
counts.append(boxcount(Z, size))
# Fit the successive log(sizes) with log (counts)
coeffs = np.polyfit(np.log(sizes), np.log(counts), 1)
return -coeffs[0]
I = rgb2gray(scipy.misc.imread("24.jpg"))
print("Minkowski–Bouligand dimension (computed): ", fractal_dimension(I))
Run Code Online (Sandbox Code Playgroud)
从我读过的文献中可以看出,自然场景(例如24.jpg)本质上更具分形性,因此应具有更大的分形维数值
它给我的结果与文献所暗示的方向相反:
10.jpg:1.259
24.jpg:1.073
我希望自然图像的分形维数大于城市的分形维数
我在代码中错误地计算了值吗?或者我只是错误地解释结果?
小智 5
在某种物理量的分形维数下,维数可能在不同阶段收敛到不同的值。例如,一条非常细的线(但具有有限的宽度)最初看起来是一维的,然后最终是二维的,因为它的宽度变得与使用的盒子差不多。
你看到了什么?线性拟合不是很好。尺寸趋向于两个值。为了进行诊断,让我们看一下所产生的灰度图像,以及您拥有的阈值(即0.9):
自然图片几乎变成了墨水斑点。如图所示,尺寸很快就会变成2的值。那是因为我们几乎失去了形象。现在的门槛是50?
有了更好的新线性拟合,城市和自然的尺寸分别为1.6和1.8。请记住,城市图片实际上具有很多结构,尤其是在斑驳的墙壁上。
将来,好的阈值将接近灰度图像的平均值,这样您的图像就不会变成墨迹!
关于这一点的一本很好的教科书是迈克尔·F·巴恩斯利(Michael F. Barnsley)的《无处不在的分形》。
| 归档时间: |
|
| 查看次数: |
6285 次 |
| 最近记录: |