Как добавить шум на изображение с помощью Python?

В этом статье мы рассмотрим, как добавить шум на изображение с помощью Python. Добавление шума может понадобиться в различных контекстах, например, в дата-анализе и машинном обучении для улучшения устойчивости моделей. Мы подробно разберем, что такое шум, какие библиотеки нам понадобятся, и как реализовать различные виды шумов.

Что такое шум в изображениях?

Шум в изображениях — это случайные вариации яркости или цвета. Существует много типов шума, включая:

  • Гауссовский шум: шум с нормальным распределением значений.
  • Шум типа соль-перец: случайные белые и черные пиксели.

Шум может ухудшить качество изображений, но он также полезен для тестирования алгоритмов обработки изображений и устойчивости моделей машинного обучения.

Установка необходимых библиотек

Для работы с изображениями и добавления шума нам понадобятся следующие библиотеки:

  • NumPy: для работы с массивами данных.
  • OpenCV: для обработки изображений.
  • Matplotlib: для отображения изображений.

Чтобы установить эти библиотеки, откройте терминал и выполните команду:

pip install numpy opencv-python matplotlib

Основы работы с изображениями в Python

Чтение и отображение изображения

Вот пример кода для чтения изображения с использованием OpenCV и его отображения с помощью Matplotlib:

import cv2
import matplotlib.pyplot as plt

# Чтение изображения
image = cv2.imread('image.jpg')

# Конвертация от BGR к RGB
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# Отображение изображения
plt.imshow(image_rgb)
plt.axis('off')
plt.show()

Вывод информации об изображении

Чтобы узнать размеры и количество каналов изображения, можем использовать следующий код:

height, width, channels = image.shape
print(f'Height: {height}, Width: {width}, Channels: {channels}')

Добавление шума на изображение

Гауссовский шум

Гауссовский шум имеет нормальное распределение значений и используется для имитации естественного шума. Вот пример для добавления такого шума:

import numpy as np

def add_gaussian_noise(image: np.ndarray, mean: float = 0, sigma: float = 25) -> np.ndarray:
    """Добавляет гауссовский шум на изображение.

    Args:
        image (np.ndarray): Исходное изображение.
        mean (float): Среднее значение шума.
        sigma (float): Стандартное отклонение шума.

    Returns:
        np.ndarray: Зашумленное изображение.
    """
    noise = np.random.normal(mean, sigma, image.shape).astype('uint8')
    noisy_image = cv2.add(image, noise)
    return noisy_image

noisy_image_gaussian = add_gaussian_noise(image)
plt.imshow(noisy_image_gaussian)
plt.axis('off')
plt.show()

Шум типа соль-перец

Шум типа соль-перец создает случайные белые и черные пиксели на изображении. Вот пример для добавления такого шума:

import numpy as np

def add_salt_and_pepper_noise(image: np.ndarray, salt_prob: float, pepper_prob: float) -> np.ndarray:
    """Добавляет шум типа соль-перец на изображение.

    Args:
        image (np.ndarray): Исходное изображение.
        salt_prob (float): Вероятность появления соли.
        pepper_prob (float): Вероятность появления перца.

    Returns:
        np.ndarray: Зашумленное изображение.
    """
    noisy = np.copy(image)
    total_pixels = image.size

    # Добавление соли
    num_salt = np.ceil(salt_prob * total_pixels)
    coords = [np.random.randint(0, i - 1, int(num_salt)) for i in image.shape]
    noisy[coords[0], coords[1], :] = 1

    # Добавление перца
    num_pepper = np.ceil(pepper_prob * total_pixels)
    coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in image.shape]
    noisy[coords[0], coords[1], :] = 0

    return noisy

noisy_image_sp = add_salt_and_pepper_noise(image, 0.02, 0.02)
plt.imshow(noisy_image_sp)
plt.axis('off')
plt.show()

Сравнение изображений

Для сравнения оригинального и зашумленного изображений можем использовать следующий метод визуализации:

plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.imshow(image_rgb)
plt.title('Оригинальное изображение')
plt.axis('off')

plt.subplot(1, 2, 2)
plt.imshow(noisy_image_gaussian)
plt.title('Зашумленное изображение')
plt.axis('off')
plt.show()

Заключение

В этой статье мы рассмотрели основные методы добавления шума на изображение с помощью Python. Мы узнали, что такое шум, и как его использовать в контексте дата-анализа и машинного обучения. Методы добавления шума могут быть полезны для улучшения устойчивости моделей и тестирования алгоритмов обработки изображений.


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