У меня есть 3D-изображение с векторными компонентами (т. е. отображение R3 в R3). Моя цель — заменить каждый вектор вектором максимальной нормы в его окрестности 3x3x3.
Эта задача оказывается неожиданно сложной. Я попытался использовать scipy.ndimage.generic_filter, но, несмотря на свое название, этот фильтр обрабатывает только скалярные входные и выходные данные. Я также кратко изучил Skimage и Sliding_window_view из numpy, но ни один из них, похоже, не дал простого решения.
Каков был бы правильный способ реализовать это?
Вот что я в итоге написал. Это не очень элегантно и довольно медленно, но должно помочь понять, что я пытаюсь сделать.
import numpy as np
import matplotlib.pyplot as plt
def max_norm_vector(data):
"""Return the vector with the maximum norm."""
data = data.reshape(-1, 3)
norms = np.linalg.norm(data, axis=-1)
idx_max = np.argmax(norms)
return data[idx_max]
if __name__ == '__main__':
# Load the image
range_ = np.linspace(-5, 5, 30)
x, y, z = np.meshgrid(range_, range_, range_, indexing='ij')
data = 1 - (x ** 2)
# Compute the gradient
grad = np.gradient(data)
grad = np.stack(grad, axis=-1) # Stack gradients along a new last axis
# grad = grad[:5, :5, :5, :] # Crop the gradient for testing
max_grad = np.zeros_like(grad)
for i in range(1,grad.shape[0]-1):
for j in range(1,grad.shape[1]-1):
for k in range(2,grad.shape[2]-1):
max_grad[i, j, k] = max_norm_vector(grad[i-1:i+2, j-1:j+2, k-1:k+2,:])
# Visualization
fig = plt.figure(figsize=(12, 6))
# Plot original data
ax1 = fig.add_subplot(121, projection='3d')
ax1.scatter(x.ravel(), y.ravel(), z.ravel(), c=data.ravel(), cmap='viridis', alpha=0.5)
ax1.set_title('Original Data')
# Plot maximum gradient vectors
ax2 = fig.add_subplot(122, projection='3d')
# Downsample for better performance
step = 3
x_down = x[::step, ::step, ::step]
y_down = y[::step, ::step, ::step]
z_down = z[::step, ::step, ::step]
max_grad_down = max_grad[::step, ::step, ::step]
ax2.quiver(x_down.ravel(), y_down.ravel(), z_down.ravel(),
max_grad_down[:, :, :, 0].ravel(), max_grad_down[:, :, :, 1].ravel(), max_grad_down[:, :, :, 2].ravel(),
length=0.1, color='red', alpha=0.7)
ax2.set_title('Maximum Gradient Vectors')
plt.tight_layout()
plt.show()
Подробнее здесь: https://stackoverflow.com/questions/791 ... -n-d-image
Как с помощью Python применять векторные операции к окрестностям n-D-изображения? ⇐ Python
Программы на Python
1732547145
Anonymous
У меня есть 3D-изображение с векторными компонентами (т. е. отображение R3 в R3). Моя цель — заменить каждый вектор вектором максимальной нормы в его окрестности 3x3x3.
Эта задача оказывается неожиданно сложной. Я попытался использовать scipy.ndimage.generic_filter, но, несмотря на свое название, этот фильтр обрабатывает только скалярные входные и выходные данные. Я также кратко изучил Skimage и Sliding_window_view из numpy, но ни один из них, похоже, не дал простого решения.
Каков был бы правильный способ реализовать это?
Вот что я в итоге написал. Это не очень элегантно и довольно медленно, но должно помочь понять, что я пытаюсь сделать.
import numpy as np
import matplotlib.pyplot as plt
def max_norm_vector(data):
"""Return the vector with the maximum norm."""
data = data.reshape(-1, 3)
norms = np.linalg.norm(data, axis=-1)
idx_max = np.argmax(norms)
return data[idx_max]
if __name__ == '__main__':
# Load the image
range_ = np.linspace(-5, 5, 30)
x, y, z = np.meshgrid(range_, range_, range_, indexing='ij')
data = 1 - (x ** 2)
# Compute the gradient
grad = np.gradient(data)
grad = np.stack(grad, axis=-1) # Stack gradients along a new last axis
# grad = grad[:5, :5, :5, :] # Crop the gradient for testing
max_grad = np.zeros_like(grad)
for i in range(1,grad.shape[0]-1):
for j in range(1,grad.shape[1]-1):
for k in range(2,grad.shape[2]-1):
max_grad[i, j, k] = max_norm_vector(grad[i-1:i+2, j-1:j+2, k-1:k+2,:])
# Visualization
fig = plt.figure(figsize=(12, 6))
# Plot original data
ax1 = fig.add_subplot(121, projection='3d')
ax1.scatter(x.ravel(), y.ravel(), z.ravel(), c=data.ravel(), cmap='viridis', alpha=0.5)
ax1.set_title('Original Data')
# Plot maximum gradient vectors
ax2 = fig.add_subplot(122, projection='3d')
# Downsample for better performance
step = 3
x_down = x[::step, ::step, ::step]
y_down = y[::step, ::step, ::step]
z_down = z[::step, ::step, ::step]
max_grad_down = max_grad[::step, ::step, ::step]
ax2.quiver(x_down.ravel(), y_down.ravel(), z_down.ravel(),
max_grad_down[:, :, :, 0].ravel(), max_grad_down[:, :, :, 1].ravel(), max_grad_down[:, :, :, 2].ravel(),
length=0.1, color='red', alpha=0.7)
ax2.set_title('Maximum Gradient Vectors')
plt.tight_layout()
plt.show()
Подробнее здесь: [url]https://stackoverflow.com/questions/79148566/with-python-how-to-apply-vector-operations-to-a-neighborhood-in-an-n-d-image[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия