Это звучит безумно? А еще лучше, кажется ли это правдоподобным?
Это очень разумно и правдоподобно. Использование g-кода могло бы сделать это, но для этого потребовался бы интерпретатор g-кода, который мог бы отображать инструкции в 2D-путь. (Не в 3D, поскольку вы упомянули, что снимаете фиксированные z-срезы.) Это может быть проблематично, но, если вы его найдете, это может сработать, но может потребовать некоторых манипуляций с анализатором. Есть несколько из них на разных языках, которые могут быть полезны.
ПРЕДПОЛОЖЕНИЕ
Судя по тому, что вы описываете, это похоже на МРТ-сканирование объекта и попытку определить его составной массовый профиль по заданной оси. В этом случае, в отличие от МРТ, у вас есть несколько цветов, поэтому которые можно использовать в ваших интересах при выборе / идентификации региона.
Даже если вы использовали интерпретатор G-кода, он воспроизвел бы изображение, площадь которого вам все равно придется вычислить, поэтому, учитывая это и учитывая, что вы стремитесь определить и классифицировать состав материала по пути (в что путь определяет границу конкретного материала, который имеет уникальный цвет), может быть несколько способов приблизиться к этому, не прибегая к g-коду:
1) Если цвета вашего материала легко (или разумно) различимы, вы можете создать цветовую маску, которая будет количественно определять занимаемую площадь, по которой вы затем сможете определить массу.
То есть, если вы сделаете фотографию среза, загрузите изображение в массив numpy, а затем выполните поиск определенного значения (например, красного), вы можете определить область области. Затем вы применяете маску к вашему массиву. После этого вы подсчитываете занятые элементы в вашем массиве, а затем делите их на размер массива (то есть строки на столбцы), что даст вам относительную занятую площадь. Поскольку вам известна масса материала и существует постоянная толщина по оси Z, это даст вам относительную массу. Пример цветовой маскировки с использованием только numpy показан здесь: http://scikit-image.org/docs/dev/user_guide/numpy_images.html
Таким образом, давайте определим пример, аналогичный вашей проблеме - допустим, у нас есть изображение красной капусты, и мы хотим знать, какая часть изображения содержит красные / пурпурные пиксели.
Чтобы упростить себе жизнь, мы установим белый цвет для любого пикселя выше определенного порога (RGB: 255 255 255), а затем посчитаем, сколько там небелых пикселей:
from copy import deepcopy
import numpy as np
import matplotlib.pyplot as plt
def plot_image(fname, color=128, replacement=(255, 255, 255), plot=False):
# 128 is a reasonable guess since most of the pixels in the image that have the
# purplish hue, have RGB's above this value.
data = imread(fname)
image_data = deepcopy(data) # copy the original data (for later use if need be)
mask = image_data[:, :, 0] < color # apply the color mask over the image data
image_data[mask] = np.array(replacement) # replace the match
if plot:
plt.imshow(image_data)
plt.show()
return data, image_data
data, image_data = plot_image('cabbage.jpg') # load the image, and apply the mask
# Find the locations of all the pixels that are non-white (i.e. 255)
# This returns 3 arrays of the same size)
indices = np.where(image_data != 255)
# Now, calculate the area: in this case, ~ 62.04 %
effective_area = indices[0].size / float(data.size)
Выбранный рассматриваемый регион показан здесь ниже:
Обратите внимание, что image_data
содержит информацию о пикселях, которая была замаскирована, и может предоставить координаты (хотя и в пиксельном пространстве) того места, где находится каждый занятый (то есть не белый) пиксель. Проблема с этим Конечно, это координаты пикселей, а не физические. Но, поскольку вы знаете физические размеры, экстраполяция этих величин выполняется легко.
Кроме того, зная эффективную площадь и физические размеры, вы можете хорошо оценить реальную занимаемую площадь. Чтобы получить лучшие результаты, измените значение цветового порога (т. Е. Цвет). В вашем реальном примере, поскольку вы знаете цвет, выполните поиск в диапазоне пикселей вокруг этого значения (чтобы компенсировать проблемы с шумом и освещением).
Вышеупомянутый метод немного груб, но эффективен, и, возможно, стоит изучить его использование в тандеме с обнаружением краев, так как это может помочь улучшить идентификацию области и выбор области. (Обратите внимание, что это не всегда строго верно!) Также может быть полезна деконволюция цвета: