1. OpenCV шаг за шагом. Введение.
2. Установка.
3. Hello World.
4. Загрузка картинки.
5. Вывод видео
6. Ползунок
7. Захват видео с камеры
8. Запись видео
9. События от мышки
10. Обработка изображения — сглаживание
11. Обработка изображения — изменение размеров
12. ROI — интересующая область изображения
13. Типы данных OpenCV
14. Матрица
15. Сохранение данных в XML
16. Генерация случайных чисел
17. Обработка изображения — морфологические преобразования
18. Обработка изображения — морфологические преобразования 2
19. Обработка изображения — заливка части изображения
20. Обработка изображения — альфа-смешивание
Альфа-канал (alpha channel) — это значение, точно такое же, как цветовые компоненты (красный, зеленый и синий). Оно определяет степень прозрачности для каждого пикселя изображения.
Однако, OpenCV пока не умеет работать с 4-канальными изображениями RGBA (как ни трудно догадаться A — это и есть обозначение альфа-канала). При загрузке RGBA изображения оно просто преобразуется в RGB.
Однако, OpenCV реализует операцию альфа-смешивания (alpha blending) — т.е. наложение изображений друг на друга с целью создания эффекта частичной прозрачности.
Этого эффекта можно добиться используя функцию cvAddWeighted().
CVAPI(void) cvAddWeighted( const CvArr* src1, double alpha, const CvArr* src2, double beta, double gamma, CvArr* dst );
— взвешенная поэлементная сумма двух массивов
формула:
dst = src1 * alpha + src2 * beta + gamma
src1 — первый исходный массив
alpha — вес элементов первого массива
src2 — второй исходный массив
beta — вес элементов второго массива
gamma — добавочная величина к каждой сумме
dst — массив для сохранения результата
массивы должны иметь одинаковый тип и размер (или размер ROI)
А вот и пример работы данной функции:
Загружаем два изображения, причём первое должно быть больше второго, т.к. на изображении image с помощью cvSetImageROI() выделяется область интереса размером со второе изображение.
Затем пиксели ROI первой картинки и пиксели второй картинки поэлементно складываются с весовыми коэффициентами alpha = 0.5 и beta = 0.5, соответственно и получается нужный эффект альфа-смешивания.
// // alpha blending // взвешенная поэлементная сумма двух массивов - cvAddWeighted() // // http://dasl.mem.drexel.edu/~noahKuntz/openCVTut2.html // #include <cv.h> #include <highgui.h> #include <stdio.h> IplImage* image = 0; IplImage* templ = 0; IplImage* dst = 0; int main(int argc, char* argv[]) { // имя картинки задаётся первым параметром char* filename = argc >= 2 ? argv[1] : "Image0.jpg"; // получаем картинку image = cvLoadImage(filename,1); printf("[i] image: %s\n", filename); assert( image != 0 ); // шаблон char* filename2 = argc >= 3 ? argv[2] : "templ.bmp"; printf("[i] template: %s\n", filename2); templ = cvLoadImage(filename2,1); assert( templ != 0 ); cvNamedWindow("origianl", CV_WINDOW_AUTOSIZE); cvNamedWindow("template", CV_WINDOW_AUTOSIZE); cvNamedWindow("res", CV_WINDOW_AUTOSIZE); dst = cvCloneImage(templ); // размер шаблона int width = templ->width; int height = templ->height; // оригинал и шаблон cvShowImage( "origianl", image); cvShowImage( "template", templ); int x = 0; int y = 0; // задаём весовые коэффициенты double alpha = 0.5; double beta = 0.5; // устанавливаем область интереса cvSetImageROI(image, cvRect(x,y,width,height)); // взвешенная сумма cvAddWeighted(image, alpha, templ, beta, 0.0, dst); // освобождаем область интереса cvResetImageROI(image); // показываем результат cvShowImage( "res", dst); // ждём нажатия клавиши cvWaitKey(0); // освобождаем ресурсы cvReleaseImage( &image ); cvReleaseImage( &templ ); cvReleaseImage( &dst ); cvDestroyAllWindows(); return 0; }
результат работы:
Ссылки
http://ru.wikipedia.org/wiki/Альфа-канал
http://stackoverflow.com/questions/1451021/alpha-channel-in-opencv
http://blog.developer.stylight.de/2010/05/how-to-load-alpha-channel-pngs-with.html
Читать далее: 21. Обработка изображения — пороговое преобразование
Один комментарий на «“20. OpenCV шаг за шагом. Обработка изображения — альфа-смешивание”»
Подскажите, пожалуйста, как реализовать soft light смешивание с учетом прозрачности. Интересно как это выглядит при попиксельной обработке.
Нашел формулу
Но как реализовать, учитывая прозрачность, не понимаю.