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

Чтобы понять фильтрацию изображений, давайте сначала разберемся с размытием изображения. Начиная с размытия по Гауссу

Размытие по Гауссу

При обработке изображений размытие по Гауссу (также известное как сглаживание по Гауссу) является результатом размытия изображения функцией Гаусса. Название происходит от имени математика и ученого Карла Фридриха Гаусса и также известно как размытие по Гауссу.

Как я уже говорил, размытие по Гауссу — это тип фильтра размытия изображения, который использует функцию Гаусса (которая также выражает нормальное распределение в статистике) для вычисления преобразования, применяемого к каждому пикселю изображения. Формула функции Гаусса в одном измерении:

В двух измерениях это произведение двух таких функций Гаусса, по одной в каждом измерении:

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

Чтобы сэкономить вычислительное время и мощность при применении размытия по Гауссу к двумерным изображениям, вместо применения матрицы Гаусса непосредственно к двумерной матрице она сначала применяется в одном измерении по горизонтали, а затем к серии одномерных матриц Гаусса. применяются вертикально. С вычислительной точки зрения это полезное свойство, поскольку вычисление может быть выполнено за O(w(kernel)*w(Image)*h(Image)) + O(h(kernel)*w(Image)* h(Image)) время, в отличие от O(w(kernel)*h(kernel) * w(Image)*h(Image)) для неотделимого ядра. (h — высота, w — ширина)

Размытие по Гауссу обычно используется при уменьшении размера изображения.

Размытие коробки

Блочное размытие также известно как прямоугольный линейный фильтр. Размытие прямоугольника часто используется для аппроксимации размытия по Гауссу.

Размытие рамки обычно реализуется как эффект изображения, который влияет на весь экран. Размытый цвет текущего пикселя представляет собой среднее значение цвета текущего пикселя и 8 соседних пикселей. Здесь вес постоянен и лежит в пределах квадрата (коробки).

Его можно вывести из этой формулы:

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

Итак, если бы нам нужно было визуально показать размытие окна, это выглядело бы так:

Чтобы реализовать Box Blur, мы можем использовать функцию openCV boxFilter()

import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread("outdoor.jpg", -1);
blurred = np.uint8(cv2.boxFilter(img, cv2.CV_64F, ksize=(5, 5), normalize=True));
f = plt.figure(figsize=(15,15));
f.add_subplot(1, 2, 1).set_title('Original Image');
plt.imshow(img[:,:,::-1])
f.add_subplot(1, 2, 2).set_title('Blurred Image');
plt.imshow(blurred[:,:,::-1]);
plt.show();

Приведенный выше код дает следующие результаты:

Минимальные и максимальные фильтры

Фильтр «Минимум» усиливает «минимальные» значения изображения, увеличивая его площадь. Подобно функции расширения, каждый 3x3 (или другой размер окна) обрабатывается для самого темного окружающего пикселя. Затем этот самый темный пиксель становится новым значением пикселя в центре окна.

Вот визуализация:

Мы можем реализовать это с помощью библиотеки PIL следующим образом.

import numpy as np
from PIL import Image, ImageFilter
from matplotlib import pyplot as plt
img = Image.open("indoor.jpg");
size = 5;
blurred = img.filter(ImageFilter.MinFilter(size=size));
f = plt.figure(figsize=(15,15))
f.add_subplot(1, 2, 1).set_title('Original Image');
plt.imshow(img)
f.add_subplot(1, 2, 2).set_title('Blurred Image');
plt.imshow(blurred)
plt.show();

Точно так же, когда мы улучшаем «самые высокие» или «максимальные» значения изображения, это называется максимальной фильтрацией.

Интересным примером использования минимальной фильтрации являются астрофотографические изображения. На многих изображениях глубокого космоса с широким полем зрения так много, таких маленьких и таких ярких звезд, что незвездные объекты, такие как диффузные туманности и уплотнения Млечного Пути, могут быть сильно затемнены ими. Модулированный минимальный фильтр (параметр Amount меньше 1) может быть применен в этих случаях, чтобы уменьшить визуальное влияние звезд, придав незвездным объектам их заслуженную значимость в сцене.

Медиана и модовая фильтрация

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

import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread(“imgs/chapter5/outdoor.jpg”, -1);
blurred = cv2.medianBlur(img, 5);
f = plt.figure(figsize=(15,15);
f.add_subplot(1, 2, 1).set_title('Original Image');
plt.imshow(img[:,:,::-1])
f.add_subplot(1, 2, 2).set_title('Blurred Image');
plt.imshow(blurred[:,:,::-1]);
plt.show();

Приведенный выше код дает следующие результаты:

Точно так же мы можем реализовать фильтр режима, используя библиотеку PIL:

img = img.filter(ImageFilter.ModeFilter(size=size));

Вариант использования: удаление шума перцем и солью

Теперь, когда я объяснил различные типы фильтрации/размытия, давайте попробуем понять, какой из них лучше всего использовать в различных ситуациях.

Давайте возьмем пример использования удаления шума соли и перца.

import numpy as np
import random
import cv2
from matplotlib import pyplot as plt
from PIL import Image, ImageFilter
#Function to add salt and pepper noise to the image
def sp_noise(image,prob):
output = np.zeros(image.shape,np.uint8)
thres = 1 - prob
for i in range(image.shape[0]):
for j in range(image.shape[1]):
rdn = random.random()
if rdn < prob:
output[i][j] = [0, 0, 0]
elif rdn > thres:
output[i][j] = [255, 255, 255]
else:
output[i][j] = image[i][j]
return output
img = cv2.imread('outdoor.jpg',1) 
noise_img = sp_noise(image,0.05)
#box filter
kernel_size=5;
box_filtered = cv2.blur(img, (kernel_size, kernel_size));
# max filter
temp = Image.fromarray(noise_img, mode="RGB");
max_filtered = temp.filter(ImageFilter.MinFilter(size=kernel_size));
# min filter
temp = Image.fromarray(noise_img, mode="RGB");
min_filtered = temp.filter(ImageFilter.MaxFilter(size=kernel_size));
# median filter
median_filtered = cv2.medianBlur(img, kernel_size);
# mode filter
temp = Image.fromarray(noise_img, mode="RGB");
mode_filtered = temp.filter(ImageFilter.ModeFilter(size=kernel_size));

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

f = plt.figure(figsize=(15,15))
f.add_subplot(4, 2, 1).set_title('Original Image');

plt.imshow(image[:,:,::-1]);
f.add_subplot(4, 2, 2).set_title('Noisy Image');

plt.imshow(noise_img[:,:,::-1]);
f.add_subplot(4, 2, 3).set_title('Box Filtered Image');

plt.imshow(box_filtered[:,:,::-1]);
f.add_subplot(4, 2, 4).set_title('Min Filtered Image');

plt.imshow(min_filtered);
f.add_subplot(4, 2, 5).set_title('Max Filtered Image');

plt.imshow(max_filtered);
f.add_subplot(4, 2, 6).set_title('Median Filtered Image');

plt.imshow(median_filtered[:,:,::-1]);
f.add_subplot(4, 2, 7).set_title('Mode Filtered Image');

plt.imshow(mode_filtered);
plt.show();

Теперь, используя matplotlib.pyplot() , мы смогли увидеть результаты различных изображений следующим образом:

Следовательно, мы видим, что наилучшие результаты достигаются при использовании изображения с медианной фильтрацией.

Это один из многих способов использования фильтрации для удаления шума и улучшения качества изображения. Различные методы фильтрации могут использоваться для удаления различных видов шума из изображений.

Использованная литература: