- Задача: Сегментировать изображения на основе текстуры без использования контролируемых методов обучения.
- Набор тестовых данных: 10 изображений из набора данных Праги, созданных с веб-сайта https://mosaic.utia.cas.cz/ .
- Мой алгоритм:
Алгоритм основан на концепции принципиальных репрезентативных шаблонов (PRP), вдохновленной методом, описанным в статье A. ДАННО-ЦЕНТРИЧЕСКИЙ ПОДХОД К НЕУПРАВЛЯЕМОЙ СЕГМЕНТАЦИИ ТЕКСТУРЫ С ИСПОЛЬЗОВАНИЕМ ПРИНЦИПНЫХ РЕПРЕЗЕНТАТИВНЫХ ШАБЛОНОВ (страницы 3–4). - Репозиторий GitHub:
Полный код моей реализации можно найти здесь: Text-Segmentation-App.
Правильно ли реализована формула гауссовой сходимости в метод Compute_texture_features?
- В статье объясняется: как вычислить характеристики текстуры ( T(i) ) с использованием принципиальных репрезентативных патчей (PRP). Чтобы оценить сходство между патчем изображения ( P_i ) и PRP, используется весовая функция Гаусса, вдохновленная известным алгоритмом шумоподавления нелокальными средствами. Сходство между патчами вычисляется с помощью функции Гаусса с параметрами (\sigma) (стандартное отклонение) и (h) (коэффициент сглаживания). Значение ( T(i) ) интерпретируется как функция массы вероятности или энергетический спектр, где каждое значение ( T(i) ) описывает вероятность того, что патч ( P_i ) соответствует основному шаблону текстуры или энергии, которая ( P_i ) проецируется на соответствующий репрезентативный образец текстуры. Более высокие значения указывают на более высокую вероятность и более интенсивную концентрацию энергии, а более низкие значения предоставляют дополнительные доказательства для лучшего описания ( P_i ).
- Формулы :
- Формула весовой функции сходства:
где: - σ > 0 — стандартное отклонение ядра Гаусса,
- h — коэффициент сглаживания,
- Z(i) — константа нормализации.
- Формула константы нормализации Z(i) это:
[*]Экран: Формула гауссова подобия.
[*]Моя реализация: я не уверен, что это правильная реализация. Мне здесь помог 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