10. OpenCV шаг за шагом. Обработка изображения — сглаживание


1. OpenCV шаг за шагом. Введение.
2. OpenCV шаг за шагом. Установка.
3. OpenCV шаг за шагом. Hello World.
4. OpenCV шаг за шагом. Загрузка картинки.
5. OpenCV шаг за шагом. Вывод видео
6. OpenCV шаг за шагом. Ползунок
7. OpenCV шаг за шагом. Захват видео с камеры
8. OpenCV шаг за шагом. Запись видео
9. OpenCV шаг за шагом. События от мышки
10. OpenCV шаг за шагом. Обработка изображения — сглаживание

Итак, мы научились загружать изображения, видео и даже получать картинку с камеры. Настала пора сделать с полученным изображением что-нибудь этакое. Начнём с простого примера сглаживания изображения.
Немного модифицируем пример загрузки изображения. Добавим дополнительное окошко для вывода результата операции сглаживания, которое осуществляется функцией cvSmooth().
В данном примере выполняется сглаживание по гауссиане (CV_GAUSSIAN) в области 3х3 вокруг каждого пикселя изображения.
Эту функцию можно использовать для устранения шумов на изображении.

#include <cv.h>
#include <highgui.h>
#include <stdlib.h>
#include <stdio.h>

IplImage* image = 0;
IplImage* dst = 0;

int main(int argc, char* argv[])
{
	// имя картинки задаётся первым параметром
	char* filename = argc == 2 ? argv[1] : "Image0.jpg";
	// получаем картинку
	image = cvLoadImage(filename,1);
	// клонируем картинку 
	dst = cvCloneImage(image);

	printf("[i] image: %s\n", filename);
	assert( image != 0 );

	// окно для отображения картинки
	cvNamedWindow("original",CV_WINDOW_AUTOSIZE);
	cvNamedWindow("smooth",CV_WINDOW_AUTOSIZE);

	// сглаживаем исходную картинку
	cvSmooth(image, dst, CV_GAUSSIAN, 3, 3);

	// показываем картинку
	cvShowImage("original",image);
	cvShowImage("smooth",dst);

	// ждём нажатия клавиши
	cvWaitKey(0);

	// освобождаем ресурсы
	cvReleaseImage(&image);
	cvReleaseImage(&dst);
	// удаляем окно
	cvDestroyWindow("original");
	cvDestroyWindow("smooth");
	return 0;
}

Результат работы от загрузки моей фотографии:

— заметен результат сглаживания.

CVAPI(void) cvSmooth( const CvArr* src, CvArr* dst,
                      int smoothtype CV_DEFAULT(CV_GAUSSIAN),
                      int size1 CV_DEFAULT(3),
                      int size2 CV_DEFAULT(0),
                      double sigma1 CV_DEFAULT(0),
                      double sigma2 CV_DEFAULT(0));

— сглаживает картинку (например, для устранения шума)
src — исходная картинка для обработки
dst — картинка для сохранения результата операции
smoothtype — тип сглаживания:

#define CV_BLUR_NO_SCALE 0
#define CV_BLUR  1
#define CV_GAUSSIAN  2
#define CV_MEDIAN 3
#define CV_BILATERAL 4

CV_BLUR_NO_SCALE — суммирование без масштабирования size1 x size2
CV_BLUR — суммирование с масштабированием 1/size1 x size2
CV_GAUSSIAN — свёртка изображения с гауссовым ядром size1 x size2
CV_MEDIAN — поиск среднего значения в окрестности size1 x size2
CV_BILATERAL — двусторонняя фильтрация окрестности size1 x size2 с цветовой сигмой = sigma1 и пространственной сигмой = sigma2 (для квадратной окрестности, т.е. size1 = size2)

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

http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html

далее, функции передаются параметры сглаживания:
size1 — размер области сглаживания (чем больше, тем сильнее сглаживание)
size2 — (при Гауссиане можно не задавать (0), тогда он будет равен size1)
sigma1 — при Гауссиане задаёт параметр отклонения g. Если 0 — рассчитывается из размера ядра по формуле:

g = 0.3*(n/2 - 1) + 0.8 ,где n - размер ядра size1

если параметр sigma1 отличен от 0, а size1=size2=0, то размер ядра расчитывается из sigma1
sigma2

результат выполнения

cvSmooth(image, dst, CV_BLUR_NO_SCALE, 3, 3);

Ссылки
http://ru.wikipedia.org/wiki/Гауссиана
http://en.wikipedia.org/wiki/Gaussian_function

Далее: 11. OpenCV шаг за шагом. Обработка изображения — изменение размеров


0 комментариев на «“10. OpenCV шаг за шагом. Обработка изображения — сглаживание”»

  1. Попробовал добавить TrackBar и изменять параметры сглаживания. Пришлось ещё добавить проверку на 0 иначе будет вылетать приложение. В результате получилось только с CV_BLUR_NO_SCALE и CV_BLUR. При CV_BILATERAL просто чёрный экран. При вызове остальных методов приложение закрывалось.

    Можете ли подсказать почему такое происходит и что надо сделать чтоб заработало?

  2. Скомпилировал данный код, и при выполнении выходит ошибка «Ошибка инициализации приложения». кто-нибудь сталкивался с такой проблемой?

  3. Здравствуйте, запустила ваш код и получила такую ошибку, при вызове cvsmooth не находит tbb_debug.dll, хотя читаю ваши уроки с самого начала, поэтому скачивала последний tbb и закидывала его в папку bin. Причем, что примечательно, при остальной работе с выводом изображения на экран всё в порядке. Может проблема с совместимостью версий tbb и openCV?

    Windows 7 x64, openCV 2.3.1, tbb 4.1

    Спасибо

    • Установила последнюю версию OpenCV и всё заработало 🙂

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение