Фильтры в OpenCV. Average и GaussianBlur — TechCave

Оглавление Линейные фильтры изображения Homogeneous (Однородное) сглаживание Gaussian сглаживание Median сглаживание Bilateral (Двустороннее) сглаживание Изображение для примера

Фильтры в OpenCV. Average и GaussianBlur

OpenCV/Обработка и распознавание изображений

Фильтры в OpenCV. Average и GaussianBlur

Оглавление

Линейные фильтры изображения

  • Homogeneous (Однородное) сглаживание
  • Gaussian сглаживание
  • Median сглаживание
  • Bilateral (Двустороннее) сглаживание

Изображение для примера.

Зебра 

Сглаживание путем усреднения

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

Фильтр, используемый здесь наиболее простейший, который называется однородным сглаживанием (homogeneous smoothing) или box фильтром.

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

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

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui_c.h>

using namespace cv;

int main(int argc, char** argv)
{
   namedWindow("Before" , CV_WINDOW_AUTOSIZE);

   // Load the source image
   Mat src = imread( "../data/zebra.jpg", 1);

   // Create a destination Mat object
   Mat dst;

   // display the source image
   imshow("Before", src);

   for (int i=1; i<51; i=i+2)
   { 
      //smooth the image in the "src" and save it to "dst"
      blur(src, dst, Size(i,i));

      //show the blurred image with the text
      imshow( "Smoothing by avaraging", dst );

      //wait for 3 seconds
      waitKey(3000);
   }
}

Синтаксис функции blur() выглядит следующим образом:

void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )

Параметры:

src — входное изображение; оно может иметь любое количество каналов, которые обрабатываются независимо друг от друга, но глубина должна быть CV_8U, CV_16U, CV_16S, CV_32F или CV_64F.

dst — вывод изображения того же размера и типа как и src.

ksize — размер ядра размытия .

anchor — узловая точка; значение по умолчанию точка (-1, -1) означает, что якорь находится в центре ядра.

borderType — пограничный режим, используемый для экстраполяции пикселей за пределами изображения.

В нашем коде, размер ядра меняется с 1x1 до 49x49. Мы видим как изображение становится более сглаженным при увеличении размера ядра.

Зебра

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.12)

project(homogeneous_smoothing_filter)

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

add_executable(homogeneous_smoothing_filter main.cpp)
target_link_libraries(homogeneous_smoothing_filter ${OpenCV_LIBS})

Ссылка на Github

Гауссово сглаживание (размытие)

Это наиболее часто используемый метод размытия. Мы можем использовать этот фильтр для устранения шумов на изображении. Но нам нужно быть очень осторожными в выборе размера ядра и стандартного отклонения распределения Гаусса по X и Y направлению. Они должны быть тщательно подобраны.

Ниже код, использующий Гауссово размывание:

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui_c.h>

using namespace cv;

int main(int argc, char** argv)
{
   namedWindow("Before" , CV_WINDOW_AUTOSIZE);

   // Load the source image
   Mat src = imread( "../data/zebra.jpg", 1);

   // Create a destination Mat object
   Mat dst;

   // display the source image
   imshow("Before", src);

   for (int i=1; i<51; i=i+2)
   { 
      // smooth the image in the "src" and save it to "dst"
      // blur(src, dst, Size(i,i));

      // Gaussian smoothing
      GaussianBlur( src, dst, Size( i, i ), 0, 0 );

      //show the blurred image with the text
      imshow( "Gaussian filter", dst );

      //wait for 5 seconds
      waitKey(5000);
   }
}

GaussianBlur() синтакс:

void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT )

Параметры:

src — входное изображение; изображение может иметь любое количество каналов, которые обрабатываются независимо друг от друга, но глубина должна быть CV_8U, CV_16U, CV_16S, CV_32F или CV_64F.

dst — выходное изображение тогоже размера и типа, что и src.

ksize — размер Гауссова ядра. ksize.width и ksize.height могут отличаться, но они оба должны быть положительными и нечетным. 

sigmaX — стандартное отклонение Гауссова ядра в направлении X.

sigmaY — стандартное отклонение Гауссова ядра в Y направлении; если sigmaY равен нулю, то устанавливается равным sigmaX, если оба сигмы нули, они вычисляются из ksize.width и ksize.height, соответственно; для тогоб чтобы полностью контролировать результат, независимо от возможных будущих модификаций, рекомендуется указать все ksize, sigmaX и sigmaY.

borderType — пиксельный метод экстраполяции.

Зебра

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.12)

project(gaussian_smoothing_filter)

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

add_executable(gaussian_smoothing_filter main.cpp)
target_link_libraries(gaussian_smoothing_filter ${OpenCV_LIBS})

Ссылка на Github

Оглавление

13:34
6236

Нет комментариев. Ваш будет первым!

Авторизация

Пользователи

naikdij88
NewEXE
Георгiй Москвитинъ
Andpyxa Tutunnik
Andrey_fox
Jane linch
genagy
Pasha Radiuk
KotikBSD

GeekBrains

Нетология

Нетология