编程语言
首页 > 编程语言> > Python分形框计数 – 分形维数

Python分形框计数 – 分形维数

作者:互联网

我有一些图像,我想要计算Minkowski/box count dimension以确定图像中的分形特征.这是2个示例图像:

10.JPG:

enter image description here

24.jpg:

enter image description here

我正在使用以下代码来计算分形维数:

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))

从我读过的文献中可以看出,自然场景(例如24.jpg)本质上更具分形性,因此应具有更大的分形维数值

它给我的结果与文献所暗示的方向相反:

> 10.jpg:1.259
> 24.jpg:1.073

我希望自然图像的分形维数大于城市的分形维数

我在代码中错误地计算了值吗?或者我只是错误地解释结果?

解决方法:

利用物理的分形维数,维度可以在不同阶段汇聚到不同的值.例如,非常细的线(但是有限宽度)最初看起来是一维的,然后最终是二维的,因为它的宽度变得与所用的盒子相当.

让我们看看你制作的尺寸:

你看到了什么?那么线性拟合并不是那么好.尺寸趋向于两个值.
要进行诊断,让我们看看产生的灰度图像,以及你拥有的阈值(即0.9):

enter image description here

enter image description here

自然图片几乎成了墨水.图表告诉我们,维度将很快达到2.那是因为我们几乎丢失了图像.
现在门槛为50?

enter image description here

enter image description here

随着新的线性配合更好,城市和自然的尺寸分别为1.6和1.8.请记住,城市画面实际上有很多结构,特别是在纹理墙壁上.

在未来,良好的阈值将更接近灰度图像的平均值,这样您的图像就不会变成一团墨水!

一本好的教科书是Michael F. Barnsley的“Fractals everywhere”.

标签:python,image-processing,numpy,fractals
来源: https://codeday.me/bug/20190522/1153992.html