Удаление выбросов из массива изображений в Python

Вопрос или проблема

Может кто-нибудь подсказать, какой будет лучший способ удалить такое огромное количество выбросов из изображения. Обычное обрезание диапазона данных в массиве numpy просто уменьшит форму данных, и восстановление изображения не будет возможным, используя такой подход. Я пробовал обрезать диапазон данных до одного стандартного отклонения, но все данные, включая выбросы, сгруппировались на краю.

Кроме того, желательно сохранить среднее значение и стандартное отклонение с оригинальным массивом данных после удаления выбросов, но это не абсолютно необходимо.

PS:
Вещи, которые следует учитывать:

  1. Удалите выбросы в диапазоне, превышающем -5 в данном профиле гистограммы, также сохраняя бимодальное распределение и форму массива (для восстановления изображения).
  2. Обрезка значений в диапазоне приводит к тому, что данные находятся на краю и искажают оригинальный результат, что нежелательно.
  3. Я пытался создать замаскированный массив в numpy, но его нельзя сохранить как оригинальный файл в rasterio.

гистограмма изображения

данные спутникового изображения

Спасибо за ваши замечания!

Просто комментарий: если вы удаляете данные, которые выделены красным, среднее значение обязательно изменится. Большое количество нулей, вероятно, связано с созданием вращаемого изображения, где пространство вокруг него было заполнено нулями. Просто заполните область другими значениями или используйте представление RGBA и сделайте его полупрозрачным. Обрезка изображения – это другое решение, но тогда вы потеряете части изображения.

Из любопытства: что изображено на картинке? Это кровеносные сосуды?

Ответ или решение

Как удалить выбросы из массивов изображений в Python

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

1. Определение выбросов

Первый шаг в удалении выбросов — это их определение. В вашем случае указано, что выбросы могут находиться в диапазоне, превышающем -5 по данной гистограмме. Для этого можно использовать метод межквартильного диапазона (IQR), который помогает выявить выбросы на основе процентилей. Вот пример, как это можно сделать в NumPy:

import numpy as np

def remove_outliers(data, threshold=-5):
    # Вычисляем первый и третий квартиль
    Q1 = np.percentile(data, 25)
    Q3 = np.percentile(data, 75)
    IQR = Q3 - Q1

    # Определяем границы
    lower_bound = Q1 - 1.5 * IQR
    upper_bound = Q3 + 1.5 * IQR

    # Фильтруем данные
    filtered_data = data[(data >= lower_bound) & (data <= upper_bound) & (data >= threshold)]
    return filtered_data

2. Сохранение формы и распределения данных

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

def filter_image(image_array, threshold=-5):
    # Создаем копию массива
    masked_array = np.zeros_like(image_array)

    # Переменная, чтобы иметь возможность хранить индексы без выбросов
    mask = (image_array >= threshold)

    # Копируем только те данные, которые не являются выбросами
    masked_array[mask] = image_array[mask]

    return masked_array

3. Реконструкция изображения

После удаления выбросов вам может потребоваться сохранить изображение в файл. Подходящий вариант — использование модуля rasterio, но не забудьте преобразовать маскированный массив в обычный массив перед сохранением:

import rasterio

def save_image(file_path, image_array):
    with rasterio.open(file_path, 'w', driver='GTiff', height=image_array.shape[0], width=image_array.shape[1], count=1, dtype=image_array.dtype) as dst:
        dst.write(image_array, 1)

# Используя фильтрацию и сохранение
filtered_image = filter_image(original_image_array, threshold=-5)
save_image('filtered_image.tif', filtered_image)

4. Примечания

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

  • При работе с данными в расслоении (например, RGBA) также можно использовать прозрачность для обработки выбросов.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...