Начало работы с цифровым керном в Python

В данной статье приводится подробное руководство по началу работы с цифровым керном с помощью 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, что также удобно при документировании проведенного анализа и отчетов.

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

Понравилась статья? Сделай репост: