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 что это
OpenCV Tutorials
- OpenCV Home Page
- How to install OpenCV for Python using Anaconda in Windows
- Reading, writing and displaying Images using OpenCV
- Find Contours In Image Using OpenCV
- Accessing and Manipulating Pixel values in Images using OpenCV
- Global Thresholding using OpenCV
- Type of Thresholding Operatios in OpenCV
- Image Binarization with Otsu’s Global Thresholding
- Adaptive Thresholding Using OpenCV
- Working with the Region of Interest (ROI) in Images
- How to draw basic shapes on images using OpenCV?
- Probabilistic Hough Transform for Line Detection
- Detect Lines in Particular Direction using Probabilistic Hough Transform
- Circle Detection via Hough Transform
- Road Line Extraction using Hough Transformation
- Color Conversions in OpenCV
- Gaussian Blurring in OpenCV
- Capture Video using OpenCV
- Extracting Frames from a Video and Saving them as Images
- Creating a Video from Images in a folder
- Object Detection with SIFT Features and Brute Force Matcher
- Obtain Image Information such as Size, Width, Height, Pixels in OpenCV
- Blurring Images Using Averaging in OpenCV
- Median Filtering of Images in OpenCV
- Bilateral Filtering in OpenCV
- 2D Convolution Operation for Image Filtering
- Hough Line Transform for Line Detection in OpenCV
- Splitting and Merging Image in OpenCV
- How to concatenate images in OpenCV?
- Image Resizing using OpenCV
- Add image border using OpenCV
- How to insert text in images?
- Text Line Detection and Recognition using OpenCV-Python
- Contour Approximation Method In OpenCV
- Face detection with HaarCascade Classifier In OpenCV
AJLearn.com
Email: info@ajlearn.net
Useful Links
Tutorials
Our Newsletter
If you are interested in hearing from us, please subscribe here!
© 2023 Copyright AJLearn.com . All Rights Reserved
What is bilateral filtering in OpenCV
Recipe Objective: What is bilateral filtering in OpenCV?
In this recipe, let us understand what image smoothing is and how it works with the Bilateral Smoothing method (also known as bilateral filtering).
Table of Contents
- Recipe Objective: What is bilateral filtering in OpenCV?
- Step 1: Import the libraries and read the image.
- Step 2: Image smoothing / Image blurring using Bilateral Smoothing
- Step 3: Displaying the output
Step 1: Import the libraries and read the image.
Let us first import the necessary libraries and read the image. The image that we are using here is the one shown below.

import numpy as np
import cv2
from matplotlib import pyplot as plt
image = cv2.imread(‘edgeflower_noisy.jpg’)Step 2: Image smoothing / Image blurring using Bilateral Smoothing
Bilateral smoothing is an edge-preserving denoising technique. As we might have noticed in the other image smoothing techniques, they generally blur out the edges. That does not happen with Bilateral smoothing, and that is why it is called an ‘edge-preserving smoothing technique. But how does it preserve the edges?
We already know that in the Gaussian smoothing technique, a weighted sum of all the pixel values in the kernel area is calculated, and the central element of the kernel is replaced with that value. But this is a function of space alone. It is not considered if the pixel lies on edge or not. This is why the Gaussian smoothing technique tends to blur out the boundaries also.
Bilateral filtering or Bilateral smoothing technique overcomes this disadvantage by introducing another Gaussian filter that considers the variation of intensities to preserve the edges.
Bilateral filtering can be implemented in OpenCV using the cv2.bilateralFilter() function, which takes the following parameters
- src: Image which is to be smoothened
- d: Dimension of the kernel
- sigmaColor: Standard deviation that controls the influence of pixels with different intensity values
- sigmaSpace: Standard deviation that controls the influence of distant pixels
Step 3: Displaying the output
It’s time to see and understand how the noise has been eliminated from our image. Let us use matplotlib subplots to display the input and the output image and analyze them.
titles = ['Original Image',"Bilateral Smoothing"] images = [image,blur] plt.figure(figsize=(13,5)) for i in range(2): plt.subplot(1,2,i+1) plt.imshow(cv2.cvtColor(images[i], cv2.COLOR_BGR2RGB)) plt.title(titles[i]) plt.xticks([]) plt.yticks([]) plt.tight_layout() plt.show()
We can see from the above output that the output has less noise and sharpness while the edges remain intact.
OpenCV в Python. Часть 3
Привет, Хабр! Это продолжение туториала по библиотеке opencv в python. Для тех кто не читал первую и вторую части, сюда: Часть 1 и Часть 2, а всем остальным — приятного чтения!

Введение
В данной части мы рассмотрим арифметику изображений, разделение и слияние каналов, различные методы размытия.
Арифметика изображений
Надеюсь, что все знают такие арифметические операции как сложение и вычитание, но при работе с изображениями мы не должны забывать о типе данных.
К примеру, у нас есть RGB изображение, пиксели которого попадают в диапазон [0,255]. Итак, что же произойдёт, если мы попытаемся к пикселю с интенсивностью 250 прибавить 30 или от 70 отнять 100? Если бы мы пользовались стандартными арифметическими правилами, то получили бы 280 и -30 соответственно. Однако, если мы работаем с RGB изображениями, где значения пикселей представлены в виде 8-битного целого беззнакового числа, то 280 и -30 не является допустимыми значениями. Для того, чтобы разобраться, что же произойдёт, давайте посмотрим на строчки кода ниже:print("opencv addition: <>".format(cv2.add(np.uint8([250]), np.uint8([30])))) print("opencv subtract: <>".format(cv2.subtract(np.uint8([70]), np.uint8([100])))) print("numpy addition: <>".format(np.uint8([250]) + np.uint8([30]))) print("numpy subtract: <>".format(np.uint8([70]) - np.uint8([71])))Как мы видим, сложение и вычитание можно осуществить с помощью функций opencv add и subtract соответственно, а также с помощью numpy. И результаты будут отличаться:
opencv addition: 255 opencv subtract: 0 numpy addition: 24 numpy subtract: 255OpenCV выполняет обрезку и гарантирует, что значения пикселей никогда не выйдут за пределы диапазона [0,255]. В numpy же всё происходит немного иначе. Представьте себе обычные настенные часы, где вместо 60 находится 255. Получается, что после достижение 255 следующим числом будет идти 0, а когда мы отнимаем от меньшего числа большее, то после 0 ( против часовой стрелки) будет идти 255.
Разбиение и слияние каналов
Как мы знаем, RGB изображение состоит из красной, зелёной и синих компонент. И что, если мы захотим разделить изображение на соответствующие компоненты? Для этого в opencv есть специальная функция — split():
image = cv2.imread('rectangles.png') b, g, r = cv2.split(image) cv2.imshow('blue', b) cv2.imshow('green', g) cv2.imshow('red', r)Сначала мы загружаем изображение. Для наглядности работы данной функции я взял следующее изображение:

Затем разделяем изображение на три канала и показываем каждый канал по отдельности. В результате выполнения данной функции отобразится три изображения в оттенках серого:

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

Как можно увидеть, красный канал очень светлый. Это происходит потому, что оттенки красного очень сильно представлены в нашем изображении. Синий и зелёный каналы, наоборот, очень тёмные. Это случается потому, что на данном изображении очень мало данных цветов.
Для того, чтобы объединить каналы воедино, достаточно воспользоваться функцией merge(), которая принимает значения каналов:merge_image = cv2.merge([g,b,r]) cv2.imshow('merge_image', merge_image) cv2.imshow('original', image) cv2.waitKey(0)
Таким образом, мы получаем такое же изображение как оригинальное, за исключением того, что я поменял местами синий с зелёным каналом.
Размытие
Размытие — это когда более резкие области на изображении теряют свою детализацию, в результате чего изображение становится менее чётким. В opencv имеются следующие основные методы размытия: averaging(усреднённое), gaussian(гауссово) и median(медианное).
Averaging
Данный фильтр делает операцию свёртки на изображении с неким ядром, где свёртка — это вычисление нового значения пикселя, при котором учитываются значения соседних пикселей. Ядро свёртки — это квадратная матрица, где пиксель в центре этой матрицы затем устанавливается как среднее значение всех других пикселей, окружающих его. Для того, чтобы воспользоваться данным размытием достаточно вызвать метод blur(), который принимает изображение и кортеж, с указанием размера ядра:
def averaging_blurring(): image = cv2.imread('girl.jpg') img_blur_3 = cv2.blur(image, (3, 3)) img_blur_7 = cv2.blur(image, (7, 7)) img_blur_11 = cv2.blur(image, (11, 11))Чем больше размер ядра, тем более размытым будет становиться изображение:

Gaussian
Гауссово размытие похоже на предыдущее размытие, за исключением того, что вместо простого среднего мы теперь используем взвешенное среднее, где соседние пиксели, которые ближе к центральному пикселю, вносят больший «вклад» в среднее. Конечным результатом является то, что наше изображение размыто более естественно:

Это размытие реализуется в opencv с помощью функции GaussianBlur(), которая принимает первые два аргумента такие же как и предыдущая функция, а третьим аргументом указываем стандартное отклонение ядра Гаусса. Установив это значение в 0, мы тем самым говорим opencv автоматически вычислять его, в зависимости от размера нашего ядра:
def gaussian_blurring(): image = cv2.imread('girl.jpg') img_blur_3 = cv2.GaussianBlur(image, (3, 3), 0) img_blur_7 = cv2.GaussianBlur(image, (7, 7), 0) img_blur_11 = cv2.GaussianBlur(image, (11, 11), 0)Median
В медианном размытии центральный пиксель изображения заменяется медианой всех пикселей в области ядра, в результате чего это размытие наиболее эффективно при удалении шума в стиле «соли». Для того, чтобы применить данный вид размытия, необходимо вызвать функцию medianBlur() и передать туда два параметра: изображение и размер ядра:
def median_blurring(): image = cv2.imread('girl.jpg') img_blur_3 = cv2.medianBlur(image, 3) img_blur_7 = cv2.medianBlur(image, 7) img_blur_11 = cv2.medianBlur(image, 11)В результате у нас получится следующее:

На этом данная часть подошла к концу. Код, как всегда, доступен на github. До скорой встречи:)