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

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

Может ли программа определить зашумленность изображения? Это может быть идеей для другого проекта, потому что наша модель шумоподавления недостаточно умна для расчета шума. Мы должны сами определять ценности. В этом случае обычно лучше всего попробовать разные значения и найти лучший результат. После некоторой практики вы приобретете больше опыта, и вам будет намного легче найти лучшие значения параметров.

Позвольте мне представить вам этот проект, а затем мы начнем.

Вступление

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

Модель шумоподавления

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

Желтые области на картинке выглядят одинаково. Кроме того, маленькие зеленые области выглядят одинаково. Алгоритм нелокального уменьшения шума выбирает пиксель, берет небольшое окно вокруг него, сканирует изображение на предмет похожих окон, усредняет все окна и вычисляет результат для замены пикселя. Этот алгоритм описывается как нелокальный, потому что он ищет все изображение, чтобы найти взаимные связи, а не просто осматривать отдельную область. Разве это не круто?

Этот алгоритм содержит две популярные функции: fastNlMeansDenoising и fastNlMeansDenoisingColored. Первая предназначена для изображений в градациях серого, а вторая - для цветных фотографий. В нашем случае мы будем использовать один для цветных изображений.

Параметры функции: src, dst, h, hcolor, templateWindowSize и searchWindowSize.

  • src: входное изображение, для которого мы хотим уменьшить шум.
  • dst: место назначения, если мы хотим экспортировать результат.
  • h: компонент яркости (большее значение h удаляет больше шума, но также может снизить качество изображения).
  • hcolor: компонент цвета (10 - рекомендованное значение в документации для цветных изображений).
  • templateWindowSize: Размер в пикселях области, которую функция будет сглаживать. Это должно быть нечетное целое число.
  • searchWindowSize: Размер в пикселях области, которую функция найдет и будет использовать в качестве ссылки. Это влияет на производительность линейно: чем больше searchWindowSize, тем больше время шумоподавления. Кроме того, это должно быть нечетное целое число (21 - это рекомендованное значение в официальной документации, поскольку оно подходит для большинства случаев зашумленных изображений).

Шаг 1. Установка пакетов

Нам нужно установить две библиотеки, чтобы наша программа работала: numpy и opencv-python. Мы можем установить их в одну строку с помощью диспетчера библиотек PIP:

pip install numpy opencv-python

Давайте продолжим и создадим новый Jupyter Notebook (но не стесняйтесь использовать среду написания кода, которую хотите). Вот мой первый блокнот, в который мы импортируем только что созданные библиотеки:

import cv2 
import numpy as np

Большой! Теперь мы можем перейти к следующему шагу, где мы импортируем и прочитаем изображение.

Шаг 2: Импорт изображения

На этом этапе мы найдем изображение, которое хотим использовать для уменьшения шума. Это может быть шумная картинка, чтобы более четко увидеть изменение. Не стесняйтесь использовать и обычное изображение - плавность все равно будет.

Вот изображение, которое я планирую использовать:

А вот строчка для чтения изображения. Мы используем imread метод OpenCV:

img = cv2.imread("test_image.png")

Теперь перейдем к третьему и заключительному шагу, где мы увидим в действии наше шумоподавление.

Шаг 3: уменьшение шума изображения

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

denoise_1 = cv2.fastNlMeansDenoisingColored(img,None,3,3,7,21) 
denoise_2 = cv2.fastNlMeansDenoisingColored(img,None,5,5,7,21) 
denoise_3 = cv2.fastNlMeansDenoisingColored(img,None,15,15,7,21)

Обозначенные изображения присваиваются различным переменным. Сохраним результаты. Мы собираемся использовать метод imwrite OpenCV. Как видите, мы передаем переменную и имя файла, который хотим сохранить.

cv2.imwrite('image_1.png', denoise_1) 
cv2.imwrite('image_2.png', denoise_2) 
cv2.imwrite('image_3.png', denoise_3)

Сравнение результатов

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

А вот изображение до и после, чтобы увидеть изменения. Я выбрал denoise_1 в качестве окончательного результата.

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

Работа над проектами практического программирования, подобными этому, - лучший способ отточить свои навыки программирования. Надеюсь, вам понравилась статья и вы узнали что-то новое сегодня. Спасибо за чтение!