Как повысить точность сегментации текстур в оттенках серого, используя принцип репрезентативных шаблоновPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как повысить точность сегментации текстур в оттенках серого, используя принцип репрезентативных шаблонов

Сообщение Anonymous »

Оценка
  • Задача: Сегментировать изображения на основе текстуры без использования контролируемых методов обучения.
  • Набор тестовых данных: 10 изображений из набора данных Праги, созданных с веб-сайта https://mosaic.utia.cas.cz/ .
  • Мой алгоритм:

    Алгоритм основан на концепции принципиальных репрезентативных шаблонов (PRP), вдохновленной методом, описанным в статье A. ДАННО-ЦЕНТРИЧЕСКИЙ ПОДХОД К НЕУПРАВЛЯЕМОЙ СЕГМЕНТАЦИИ ТЕКСТУРЫ С ИСПОЛЬЗОВАНИЕМ ПРИНЦИПНЫХ РЕПРЕЗЕНТАТИВНЫХ ШАБЛОНОВ (страницы 3–4).
  • Репозиторий GitHub:

    Полный код моей реализации можно найти здесь: Text-Segmentation-App.
Вопросы:
  • Является ли Формула гауссовой сходимости правильно реализована в Compute_texture_features метод?
    • В статье объясняется: как вычислить характеристики текстуры ( T(i) ) с использованием основных репрезентативных патчей (ПРП). Чтобы оценить сходство между патчем изображения ( P_i ) и PRP, используется весовая функция Гаусса, вдохновленная известным алгоритмом шумоподавления нелокальными средствами. Сходство между патчами вычисляется с помощью функции Гаусса с параметрами (\sigma) (стандартное отклонение) и (h) (коэффициент сглаживания). Значение ( T(i) ) интерпретируется как функция массы вероятности или энергетический спектр, где каждое значение ( T(i) ) описывает вероятность того, что патч ( P_i ) соответствует основному шаблону текстуры или энергии, которая ( P_i ) проецируется на соответствующий репрезентативный образец текстуры. Более высокие значения указывают на более высокую вероятность и более интенсивную концентрацию энергии, а более низкие значения предоставляют дополнительные доказательства для лучшего описания ( P_i ).
    • Формулы :

      Формула весовой функции сходства:

    Код: Выделить всё

    w(P_i, P_j) = 1 / Z(i) * exp( - || P_i - P_j ||^2 / (2 * σ_h^2) )
    
    где:
  • — стандартное отклонение ядра Гаусса,
  • — коэффициент сглаживания,
  • — константа нормализации.
  • Формула константы нормализации Z(i) это:

Код: Выделить всё

Z(i) = Σ_j exp( - || P_i - P_j ||^2 / (2 * σ_h^2) )
[*]Экран: Формула гауссова подобия.

[*]Моя реализация: я не уверен, что это правильная реализация. Мне здесь помог ChatGPT. Одна из проблем заключается в том, что в статье для моего набора данных использовался параметр 0,1 для сходимости по Гауссу. Однако у меня он стабильно работает только с версией 1.0. Итак, я думаю, что, возможно, где-то допустил ошибку при реализации этой формулы.

Код: Выделить всё

 @staticmethod
def compute_texture_features(
image: np.ndarray,
prp_centroids: np.ndarray,
*,
patch_size: Tuple[int, int] = (7, 7),
patch_step: int = 1,
gamma: float = 1.0
) -> np.ndarray:
# Get image dimensions
height, width = image.shape

# Initialize array to store texture features
texture_features = np.zeros((height, width))

# Extract patches from the image
patches = TextureSegmentation.extract_patches(image, patch_size, patch_step)
print(patches.shape)

patch_vectors = patches.reshape(patches.shape[0], -1)

# Reshape PRP centroids
prp_centroids = prp_centroids.reshape(prp_centroids.shape[0], -1)

# Calculate RBF kernel similarities
similarities = rbf_kernel(patch_vectors, prp_centroids, gamma=gamma)
# Normalize similarities
sum_similarities = similarities.sum(axis=1, keepdims=True)
probabilities = np.divide(similarities, sum_similarities,
where=sum_similarities > 0,
out=np.full_like(similarities, 1.0 / similarities.shape[1]))

# Average probabilities across all patches for each PRP
mean_probabilities = np.mean(probabilities, axis=0)
contrast_weights = np.abs(probabilities - mean_probabilities)  # Difference from global mean

# Update probabilities with contrast weights
enhanced_probabilities = probabilities * contrast_weights

# Get cluster assignments
cluster_assignments = np.argmax(enhanced_probabilities, axis=1)

# Map the results back to the image dimensions
n_patches_h = (height - patch_size[0]) // patch_step + 1
n_patches_w = (width - patch_size[1]) // patch_step + 1
offset_h = patch_size[0] // 2
offset_w = patch_size[1] // 2
for idx, cluster in enumerate(cluster_assignments):
# Find the coordinates of the starting point of the patch
row_start = (idx // n_patches_w) * patch_step
col_start = (idx % n_patches_w) * patch_step

# Update the area corresponding to the patch
texture_features[row_start:row_start + patch_size[0], col_start:col_start + patch_size[1]] = cluster

return texture_features


Подробнее здесь: https://stackoverflow.com/questions/793 ... e-principl
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»