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)
сглаживающая фильтрация, при которой значение интенсивности пикселя определяется средневзвешенным значением интенсивности соседних пикселей, причём веса зависят не только от евклидового расстояния, но и от расстояния в цветовом пространстве.

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);



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



Далее: 11. OpenCV шаг за шагом. Обработка изображения — изменение размеров
  • 0
  • 29 июля 2010, 22:08
  • noonv

Комментарии (4)

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

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

Mur

  • 6 ноября 2010, 02:26
+
0
Скомпилировал данный код, и при выполнении выходит ошибка «Ошибка инициализации приложения». кто-нибудь сталкивался с такой проблемой?
avatar

bashka

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

Windows 7 x64, openCV 2.3.1, tbb 4.1

Спасибо
avatar

IKI

  • 27 августа 2013, 10:57
+
+1
Установила последнюю версию OpenCV и всё заработало :)
avatar

IKI

  • 27 августа 2013, 11:56

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.