<jupyter_start><jupyter_text>Вычисление мультифрактального спектра с помощью функции плотности. __Мультифрактальный спектр цифрового изображения__ - множество фрактальных размерностей его фрактальных подмножеств.- $\mu$ обозначает меру интенсивностей пикселей.- Для каждого $x \in R^2$ обозначим за $B(x,r)$ квадрат с центром $x$ и “радиусом” (половиной длины стороны) $r$.- Функция плотности определяется следующим образом: $d(x)=\underset{r \rightarrow 0}{lim}\frac{log \mu (B(x, r))}{log r}$ (Считается для каждой точки)<jupyter_code>import requests
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from io import BytesIO
from PIL import Image
from scipy.ndimage.filters import convolve, median_filter, maximum_filter
from scipy.stats import linregress
from progressbar import ProgressBar
im = Image.open('data/silver/large.jpg')
im
def rgb2gray(rgb):
    return np.dot(rgb[...,:3], [1/3, 1/3, 1/3])
immat = rgb2gray(np.array(im))
len(rs)
rs = range(2, 10)
dxs = []
for r in rs:
    dx = convolve(immat, np.ones((r*2, r*2)), mode='constant')
    dxs.append(dx.ravel())<jupyter_output><empty_output><jupyter_text>Предел вычисляем с помощью МНК<jupyter_code>frac_dims = []
bar = ProgressBar()
for l in bar(np.array(dxs).T):
    frac_dims.append(linregress(np.log(rs), np.log(l)).slope)
plt.imshow(np.array(frac_dims).reshape(immat.shape) >= np.mean(frac_dims)-0.3, cmap='gray')
plt.imshow(np.array(frac_dims).reshape(immat.shape) > np.mean(frac_dims)-0.6, cmap='gray')<jupyter_output><empty_output><jupyter_text>Затем, получив все $d(x)$, считаем фрактульную размерность для изображений для различных $\alpha$ следующим образом:$d(x)$ характеризует степень неоднородности распределения интенсивности в окрестности точки $x$. Множество всех точек $x$, имеющих локальную плотность $\alpha$, образует множество уровня $E_{\alpha}=\{x \in R^2: d(x)=\alpha \}$. На практике часто для того, чтобы не увеличивать количество множеств уровня, рассматривают множества $E(\alpha, \epsilon)=\{x \in R^2: d(x)\in [\alpha, \alpha + \epsilon)\}$.Далее мы вычисляем фрактальные размерности множеств $E_{\alpha}$ и получаем фрактальный спектр $f(\alpha)$.<jupyter_code>def frac_dim(immat):    
    # Задаем размер квадрата, которым будем ходить по изображению
    ws = range(1, 10)
    # К-во квадратов, куда попал черный пиксель
    ns = []
    for w in ws:
        ns.append(np.sum(maximum_filter(immat, (w, w), mode='constant')[::w, ::w]))
        
    x = np.log(1/np.array(ws))
    y = np.log(ns)
    
    slope = linregress(x, y).slope
    
    return slope
frac_spec = []
alphas = np.linspace(np.min(frac_dims), np.max(frac_dims), num=15)
for a0, a1 in zip(alphas[:-1], alphas[1:]):
    frac_im = np.array(frac_dims).reshape(immat.shape)
    frac_im = (frac_im > a0) & (frac_im < a1)
    frac_spec.append(frac_dim(frac_im))
    
    plt.figure(figsize=(10, 10))
    plt.imshow(frac_im, cmap='Greys', interpolation='nearest')
    plt.show()
plt.plot(alphas[:-1], frac_spec, '-o')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1442655274400263, 'fraction_numerical': 0.012816299704239238, 'mean_word_length': 4.9337231968810915, 'pattern_counts': {'":': 0, '<': 14, '<?xml version=': 0, '>': 16, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '402462', 'license': 'MIT', 'n_tokens_mistral': 1264, 'n_tokens_neox': 1368, 'n_words': 274, 'path': 'multifractal specter with density function.ipynb', 'repo_name': 'churnikov/fractal_analysis', 'size': '3043'}