В данной статье приводится подробное руководство по началу работы с цифровым керном с помощью python.
В современном мире можно диджитализировать практически все, и это не обошло стороной и геологию, начиная от цифрового керна, до цифровых двойников нефтегазовых месторождений.
Наверное, каждому геологу хотелось бы создать свой собственный цифровой керн. К счастью для этого не нужно быть профессионалом кодинга на пайтоне, достаточно всего лишь установить библиотеку porespy. Более опытные пользователи также могут установить пакет openpnm, с помощью которого можно расширить инструментарий для анализа цифрового керна.
Устанавливать этот пакет для версий Python 3.8+ лучше всего через Anaconda следующей командой (согласно рекомендациям на официальном сайте porespy):
conda install -c conda-forge porespy
После установки можно приступить, например, к созданию 2d-изображения цифрового керна, аналогично тому, как это изображение было бы получено после обработки данных компьютерной томографии, или же можно начать работать с имеющимися изображениями керна.
Для начала, давайте сгенерируем свой собственный образец для дальнейших экспериментов и проведения анализа, а затем попробуем подгрузить реальное изображение, для которого будут справедливы те же самые метрики и операции над керном.
import porespy as ps import matplotlib.pyplot as plt im = ps.generators.blobs(shape=[500, 500], porosity=0.6, blobiness=2) plt.imshow(im)
В настройках функции blobs можно задать коэффициент пористости и размеры самого слайса.

Один из стандартно используемых фильтров для данного пакета — локальная толщина (local thickness), с помощью которого для каждого вокселя (аналог двумерного пикселя для трёхмерного пространства) определяется значение радиуса перекрывающей его сферы. Анализируя полученные значения, можно получить информацию о распределении пор по размерам. Давайте попробуем рассчитать данную метрику:
local_thickness = ps.filters.local_thickness(im) plt.imshow(local_thickness)

Для загрузки имеющихся цветных .png изображений можно воспользоваться следующим кодом, предварительно необходимо установить пакет PIL:
from PIL import Image import numpy as np path ="Result_img.png" threshold = 100 img = Image.open(path).convert('L') arr = np.array(img) print("Max=", np.max(img)) print("Min=", np.min(img)) binarized = 1.0 * (arr < threshold) binarized= binarized.astype(bool) imshape=binarized.shape fig, axs = plt.subplots(1, 1, figsize=[10, 10]) axs.imshow(binarized) plt.show()
В данном случае происходит бинаризация изображения по задаваемому пороговому значению (threshold), разграничивающему поровое пространство от пространства горной породы. Данное пороговое значение в конечном итоге будет влиять на значение пористости.

Теперь давайте посчитаем общую пористость для данного изображения:
poro_val= ps.metrics.porosity(binarized) print("Пористость для данного слайса цифрового керна: ", poro_val)
Можно также при необходимости рассчитать пористость в различных направлениях:
poro_along_X= ps.metrics.porosity_profile(binarized, 0) poro_along_Y= ps.metrics.porosity_profile(binarized, 1) plt.plot(poro_along_X,label='Пористость вдоль оси X') plt.plot(poro_along_Y,label='Пористость вдоль оси Y') plt.xlabel("Пиксели") plt.ylabel("Пористость, %") plt.grid("True") plt.legend() plt.show()

Таким же самым образом можно производить анализ серий слайсов, формирующих объемное изображение для отсканированного или сгенерированного образца цифрового керна. Обработанные данным можно также визуализировать в Paraview, что также удобно при документировании проведенного анализа и отчетов.
Данный пакет также предоставляет функционал для симуляции процесса насыщения цифрового керна различными флюидами, более подробно об этом будет написано в следующей статье.