画像のフラクタル特性を決定するために ミンコフスキー/ボックスカウント次元 を計算したい画像がいくつかあります。次に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))
私が読んだ文献から、自然の風景が示唆されています(例:24.jpg
)本質的にフラクタルであるため、フラクタル次元の値を大きくする必要があります
それが私に与える結果は、文献が示唆するものとは反対の方向にあります:
10.jpg
:1.259
24.jpg
:1.073
自然画像のフラクタル次元は都市よりも大きいと思います
コードで値を正しく計算していませんか?それとも、結果を間違って解釈しているだけですか?
物理的なもののフラクタル次元では、次元はさまざまな段階でさまざまな値に収束する可能性があります。たとえば、非常に細い線(ただし、幅が有限)は、最初は1次元に見えますが、幅が使用されるボックスに匹敵するサイズになると、最終的には2次元になります。
何が見えますか?まあ、線形フィットはあまり良くありません。そして、次元は2の値に向かっています。診断するために、生成されたグレースケール画像を、現在のしきい値(つまり、0.9)で見てみましょう。
自然の絵はほとんどインクの塊になっています。グラフが示すように、ディメンションはすぐに2の値になります。それは私たちがほとんどイメージを失ったからです。そして今、50のしきい値で?
はるかに優れた新しい線形フィットにより、寸法は都市と自然でそれぞれ1.6と1.8になります。都会の写真には、特にテクスチャのある壁に、実際には多くの構造があることに注意してください。
将来的には、適切なしきい値はグレースケール画像の平均に近い値になります。そうすれば、画像がインクの塊に変わることはありません。
これに関する良い教科書は、マイケルF.バーンズリーによる「どこでもフラクタル」です。