OpenCV – двусторонний фильтр
Фильтрация изображений позволяет применять к изображению различные эффекты. В этой главе и последующих трех главах мы собираемся обсудить различные операции фильтрации, такие как двусторонний фильтр, коробочный фильтр, блочный фильтр SQR и фильтр2D.
Двусторонний фильтр
Операция «Двусторонний фильтр» применяет двустороннее изображение к фильтру. Вы можете выполнить эту операцию над изображением, используя метод medianBlur () класса imgproc . Ниже приводится синтаксис этого метода.
bilateralFilter(src, dst, d, sigmaColor, sigmaSpace, borderType)
Этот метод принимает следующие параметры –
- src – Объект Mat, представляющий источник (входное изображение) для этой операции.
- dst – объект Mat, представляющий место назначения (выходное изображение) для этой операции.
- d – переменная типа integer, представляющая диаметр окрестности пикселя.
- sigmaColor – переменная типа integer, представляющая сигма фильтра в цветовом пространстве.
- sigmaSpace – переменная типа integer, представляющая сигма фильтра в координатном пространстве.
- borderType – Целочисленный объект, представляющий тип используемой границы.
src – Объект Mat, представляющий источник (входное изображение) для этой операции.
dst – объект Mat, представляющий место назначения (выходное изображение) для этой операции.
d – переменная типа integer, представляющая диаметр окрестности пикселя.
sigmaColor – переменная типа integer, представляющая сигма фильтра в цветовом пространстве.
sigmaSpace – переменная типа integer, представляющая сигма фильтра в координатном пространстве.
borderType – Целочисленный объект, представляющий тип используемой границы.
пример
Следующая программа демонстрирует, как выполнить операцию двустороннего фильтра на изображении.
import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; public class BilateralFilter public static void main(String args[]) // Loading the OpenCV core library System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); // Reading the Image from the file and storing it in to a Matrix object String file ="E:/OpenCV/chap11/filter_input.jpg"; Mat src = Imgcodecs.imread(file); // Creating an empty matrix to store the result Mat dst = new Mat(); // Applying Bilateral filter on the Image Imgproc.bilateralFilter(src, dst, 15, 80, 80, Core.BORDER_DEFAULT); // Writing the image Imgcodecs.imwrite("E:/OpenCV/chap11/bilateralfilter.jpg", dst); System.out.println("Image Processed"); > >
Предположим, что следующим является входное изображение filter_input.jpg, указанное в вышеуказанной программе.

Выход
При выполнении программы вы получите следующий вывод:
Image Processed
Если вы откроете указанный путь, вы можете наблюдать выходное изображение следующим образом –
Фильтрация в OpenCV: функции inRange(), medianBlur()
![]()
В уроке разберем понятие фильтрации, функцию inRange() для фильтрации, функцию medianBlur() для размытия в OpenCV. Сделаем фильтрацию с помощью ползунков.
Понятие фильтрации
Термин «фильтрация» применим к разным сферам, например, к физическим объектам и к информации. Мы используем фильтры для воды, чтобы очистить жидкость от примесей и различных бактерий.

Фильтрация — отделение нужного от ненужного. Мы будем отделять полезный сигнал от всех остальных.
Любое изображение является набором пикселей. Каждый пиксель задается определенным набором чисел. Подробнее про цветовые пространства читайте в статье. Чаще всего используются RGB пространства, то есть соотношение красного, зеленого и синего. Это соотношения задаются в диапазонах от 0 до 255.
Функция inRange()
Для фильтрации изображения используется функция вида inRange(img, l_s, r_s). Первый параметр — изменяемое изображение, а второй и третий — левая и правая граница пропускаемого цвета. Для границ мы будем использовать ползунки. Для задания каждой из границ потребуется 3 ползунка, так как у нас 3 канала в RGB. Всего нужно шесть ползунков.
Функция inRange() на выходе дает набор пикселей со значением либо 0, либо единица, т.е. цвет удовлетворяет заданным границам или не удовлетворяет.
На этом изображении введено ограничение только на пропускаемую красную составляющую. На примере пропускаем пиксели интенсивностью от 192 до 255 в красном цветовом канале:

Создание фильтра
Создаем окно настроек с 6 ползунками. Значение снимаем в цикле отображения изображения, где также отображаем отфильтрованное изображение:
import numpy as np import cv2 # создаем пустую функцию def nothing(args):pass # создаем окно для отображения результата и бегунки cv2.namedWindow("setup") cv2.createTrackbar("b1", "setup", 0, 255, nothing) cv2.createTrackbar("g1", "setup", 0, 255, nothing) cv2.createTrackbar("r1", "setup", 0, 255, nothing) cv2.createTrackbar("b2", "setup", 255, 255, nothing) cv2.createTrackbar("g2", "setup", 255, 255, nothing) cv2.createTrackbar("r2", "setup", 255, 255, nothing) fn = "KOT.jpg" # путь к файлу с картинкой img = cv2.imread(fn) # загрузка изображения while True: r1 = cv2.getTrackbarPos('r1', 'setup') g1 = cv2.getTrackbarPos('g1', 'setup') b1 = cv2.getTrackbarPos('b1', 'setup') r2 = cv2.getTrackbarPos('r2', 'setup') g2 = cv2.getTrackbarPos('g2', 'setup') b2 = cv2.getTrackbarPos('b2', 'setup') # собираем значения из бегунков в множества min_p = (g1, b1, r1) max_p = (g2, b2, r2) # применяем фильтр, делаем бинаризацию img_g = cv2.inRange(img, min_p, max_p) cv2.imshow('img', img_g) if cv2.waitKey(33) & 0xFF == ord('q'): break cv2.destroyAllWindows()
Если мы выведем наложение исходного изображения и полученной выше маски, то получим изображение с пропущенными цветами:

Для создания такого фильтра необходимо использовать операцию bitwise_and(sr1, sr2, mask = mask). Операция является логическим умножением массива sr1 на массив sr2. Если ввести дополнительный параметр выходного массива mask = mask, то в качестве маски активируем полученный ранее «фильтрат».
import numpy as np import cv2 def nothing(args):pass cv2.namedWindow("setup") cv2.createTrackbar("b1", "setup", 0, 255, nothing) cv2.createTrackbar("g1", "setup", 0, 255, nothing) cv2.createTrackbar("r1", "setup", 0, 255, nothing) cv2.createTrackbar("b2", "setup", 255, 255, nothing) cv2.createTrackbar("g2", "setup", 255, 255, nothing) cv2.createTrackbar("r2", "setup", 255, 255, nothing) fn = "KOT.jpg" # путь к файлу с картинкой img = cv2.imread(fn) # загрузка изображения while True: r1 = cv2.getTrackbarPos('r1', 'setup') g1 = cv2.getTrackbarPos('g1', 'setup') b1 = cv2.getTrackbarPos('b1', 'setup') r2 = cv2.getTrackbarPos('r2', 'setup') g2 = cv2.getTrackbarPos('g2', 'setup') b2 = cv2.getTrackbarPos('b2', 'setup') min_p = (g1, b1, r1) max_p = (g2, b2, r2) img_mask = cv2.inRange(img, min_p, max_p) img_m = cv2.bitwise_and(img, img, mask = img_mask) # создание фильтра cv2.imshow('img', img_m) if cv2.waitKey(33) & 0xFF == ord('q'): break cv2.destroyAllWindows()
Функция сглаживания
Некоторые инструменты улучшают результаты работы фильтра. Это достигается с помощью первичной обработки изображения.
Мы можем получить более сглаженную маску. Для этого избавляем изображение от резких цветовых переходов через функцию medianBlur(img, blur). Функция принимает на вход размываемое изображение и параметр размытия.
Добавляем ползунок для размытия изображения:
import numpy as np import cv2 def nothing(args):pass cv2.namedWindow("setup") cv2.namedWindow("setup2") cv2.createTrackbar("b1", "setup", 0, 255, nothing) cv2.createTrackbar("g1", "setup", 0, 255, nothing) cv2.createTrackbar("r1", "setup", 0, 255, nothing) cv2.createTrackbar("b2", "setup", 255, 255, nothing) cv2.createTrackbar("g2", "setup", 255, 255, nothing) cv2.createTrackbar("r2", "setup", 255, 255, nothing) cv2.createTrackbar("blur", "setup2", 0, 10, nothing) fn = "KOT.jpg" # путь к файлу с картинкой img = cv2.imread(fn) # загрузка изображения percent = 50 width = int(img.shape[1] * percent / 100) height = int(img.shape[0] * percent / 100) dim = (width, height) img = cv2.resize(img, dim) while True: r1 = cv2.getTrackbarPos('r1', 'setup') g1 = cv2.getTrackbarPos('g1', 'setup') b1 = cv2.getTrackbarPos('b1', 'setup') r2 = cv2.getTrackbarPos('r2', 'setup') g2 = cv2.getTrackbarPos('g2', 'setup') b2 = cv2.getTrackbarPos('b2', 'setup') blur = cv2.getTrackbarPos('blur', 'setup2') min_p = (g1,b1,r1) max_p = (g2,b2,r2) img_bl = cv2.medianBlur(img, 1+blur*2) # сглаживание изображения img_mask = cv2.inRange(img_bl, min_p, max_p) img_m = cv2.bitwise_and(img, img, mask = img_mask) cv2.imshow('img', img_m) if cv2.waitKey(33) & 0xFF == ord('q'): break cv2.destroyAllWindows()
Изменяем настройки размытия и получаем изображение:

Курсы Робикс, в которых изучается этот материал.
3 фильтра изображений в OpenCV – двусторонний, Box и 2d
Фильтрация изображений — это процесс изменения изображения путем изменения его оттенков или цвета пикселя. Он также используется для увеличения яркости и контрастности. В этом уроке мы узнаем о нескольких типах фильтров изображений OpenCV.
Двусторонний фильтр
OpenCV предоставляет функцию bilateralFilter() для применения двустороннего фильтра к изображению. Двусторонний фильтр может очень хорошо уменьшить нежелательный шум, сохраняя при этом четкие края. Синтаксис функции приведен ниже:
cv2.bilateralFilter(src, dst, d, sigmaSpace, borderType)
Параметры
- src — обозначает источник изображения. Это может быть 8-битное или одноканальное изображение с плавающей запятой.
- dst — обозначает целевое изображение того же размера. Его тип будет таким же, как у образа src.
- d — обозначает диаметр окрестности пикселя (целочисленный тип), который используется при фильтрации. Если его значение отрицательное, то оно вычисляется из sigmaSpace.
- sigmaColor — обозначает сигму фильтра в цветовом пространстве.
- sigmaSpace – обозначает сигму фильтра в координатном пространстве.
Рассмотрим следующий пример:
import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread(r'C:\Users\DEVANSH SHARMA\baloon.jpg',1) kernel = np.ones((5,5),np.float32)/25 blur = cv2.bilateralFilter(img,9,75,75) plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(blur),plt.title('Bilateral Filter') plt.xticks([]), plt.yticks([]) cv2.imshow("Image",blur)

Box-фильтр
Мы можем выполнить этот фильтр, используя функцию boxfilter(). Это похоже на операцию усреднения размытия. Синтаксис функции приведен ниже:
cv2. boxfilter(src, dst, ddepth, ksize, anchor, normalize, bordertype)
Параметры
- src — обозначает источник изображения. Это может быть 8-битное или одноканальное изображение с плавающей запятой.
- dst — обозначает целевое изображение того же размера. Его тип будет таким же, как у образа src.
- ddepth — обозначает глубину выходного изображения.
- ksize — размывает размер ядра.
- anchor — обозначает точки привязки. По умолчанию его значение указывает на координаты(-1,1), что означает, что якорь находится в центре ядра.
- normalize — это флаг, указывающий, должно ли ядро быть нормализовано или нет.
- borderType — целочисленный объект, представляющий тип используемой границы.
Рассмотрим следующий пример:
import cv2 import numpy as np # using imread('path') and 0 denotes read as grayscale image img = cv2.imread(r'C:\Users\DEVANSH SHARMA\baloon.jpg',1) img_1 = cv2.boxFilter(img, 0,(7,7), img,(-1,-1), False, cv2.BORDER_DEFAULT) #This is using for display the image cv2.imshow('Image',img_1) cv2.waitKey(3) # This is necessary to be required so that the image doesn't close immediately. #It will run continuously until the key press. cv2.destroyAllWindows()

Фильтр 2D
Он объединяет образ с ядром. Мы можем выполнить эту операцию с изображением, используя метод Filter2D(). Синтаксис функции приведен ниже:
cv2.Filter2D(src, dst, kernel, anchor =(-1,-1))
Параметры
- src — представляет входное изображение.
- dst — обозначает целевое изображение того же размера. Его тип будет таким же, как у образа src.
- kernel — это ядро свертки, одноканальная матрица с плавающей запятой. Если вы хотите применить разные ядра к разным каналам, разбейте изображение на отдельную цветовую плоскость с помощью команды split(), обрабатывая их по отдельности.
- anchor — обозначает точки привязки, по умолчанию его значение Point (-1,1), что означает, что он находится в центре ядра.
- borderType — целочисленный объект, представляющий тип используемой границы.
Рассмотрим следующий пример:
import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread(r'C:\Users\DEVANSH SHARMA\baloon.jpg',1) kernel = np.ones((5,5),np.float32)/25 dst = cv2.filter2D(img,-1,kernel) plt.subplot(121),plt.imshow(img),plt.title('Original') plt.xticks([]), plt.yticks([]) plt.subplot(122),plt.imshow(dst),plt.title('Filter2D') plt.xticks([]), plt.yticks([]) plt.show()
Bilateral filter opencv что это
In this tutorial you will learn how to apply diverse linear filters to smooth images using OpenCV functions such as:
Theory
- Smoothing, also called blurring, is a simple and frequently used image processing operation.
- There are many reasons for smoothing. In this tutorial we will focus on smoothing in order to reduce noise (other uses will be seen in the following tutorials).
- To perform a smoothing operation we will apply a filter to our image. The most common type of filters are linear, in which an output pixel’s value (i.e. \(g(i,j)\)) is determined as a weighted sum of input pixel values (i.e. \(f(i+k,j+l)\)) : \[g(i,j) = \sum_ f(i+k, j+l) h(k,l)\] \(h(k,l)\) is called the kernel, which is nothing more than the coefficients of the filter. It helps to visualize a filter as a window of coefficients sliding across the image.
- There are many kind of filters, here we will mention the most used:
Normalized Box Filter
- This filter is the simplest of all! Each output pixel is the mean of its kernel neighbors ( all of them contribute with equal weights)
- The kernel is below: \[K = \dfrac\cdot K_> \begin 1 & 1 & 1 & . & 1 \\ 1 & 1 & 1 & . & 1 \\ . & . & . & . & 1 \\ . & . & . & . & 1 \\ 1 & 1 & 1 & . & 1 \end\]
Gaussian Filter
- Probably the most useful filter (although not the fastest). Gaussian filtering is done by convolving each point in the input array with a Gaussian kernel and then summing them all to produce the output array.
- Just to make the picture clearer, remember how a 1D Gaussian kernel look like?

Assuming that an image is 1D, you can notice that the pixel located in the middle would have the biggest weight. The weight of its neighbors decreases as the spatial distance between them and the center pixel increases. Note Remember that a 2D Gaussian can be represented as : \[G_<0>(x, y) = A e^< \dfrac< -(x - \mu_)^ >< 2\sigma^_ > + \dfrac< -(y - \mu_)^ >< 2\sigma^_ > >\] where \(\mu\) is the mean (the peak) and \(\sigma^\) represents the variance (per each of the variables \(x\) and \(y\))0>
Median Filter
The median filter run through each element of the signal (in this case the image) and replace each pixel with the median of its neighboring pixels (located in a square neighborhood around the evaluated pixel).
Bilateral Filter
- So far, we have explained some filters which main goal is to smooth an input image. However, sometimes the filters do not only dissolve the noise, but also smooth away the edges. To avoid this (at certain extent at least), we can use a bilateral filter.
- In an analogous way as the Gaussian filter, the bilateral filter also considers the neighboring pixels with weights assigned to each of them. These weights have two components, the first of which is the same weighting used by the Gaussian filter. The second component takes into account the difference in intensity between the neighboring pixels and the evaluated one.
- For a more detailed explanation you can check this link
Code
- What does this program do?
- Loads an image
- Applies 4 different kinds of filters (explained in Theory) and show the filtered images sequentially
- Downloadable code: Click here
- Code at glance: