【OpenCV】图像代数运算:平均值去噪,减去背景
代数运算,就是对两幅图像的点之间进行加、减、乘、除的运算。四种运算相应的公式为:

代数运算中比较常用的是图像相加和相减。图像相加常用来求平均值去除addtive噪声或者实现二次曝光(double-exposure)。图像相减用于减去背景或周期噪声,污染等。
图像相加
- void cvAcc(
- const CvArr* image,//输入图像
- CvArr* sum, //累积图像
- const CvArr* mask=NULL//可选的运算
- );
我们还需要用到一个线性变换转换函数来对相加的结果求平均
- void cvConvertScale(
- const CvArr* src, //输入数组
- CvArr* dst,//输出数组
- double scale=1,//比例
- double shift=0 //缩放比例,可选
- );
- #define cvCvtScale cvConvertScale
- #define cvScale cvConvertScale
- #define cvConvert( src, dst ) cvConvertScale( (src), (dst), 1, 0 )
实践:平均值去噪
- int main()
- {
- CvCapture* capture=cvCaptureFromFile("media.avi");
- IplImage* frame= NULL;
- IplImage * imgsum =NULL;
- int start=301;
- int end=304;
- cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, start);
- int count = start;
- while( cvGrabFrame(capture) && count <= end )
- {
- frame = cvRetrieveFrame(capture);// 获取当前帧
- if(imgsum==NULL){
- imgsum=cvCreateImage(cvGetSize(frame),IPL_DEPTH_32F,3);
- cvZero(imgsum);
- }
- cvAcc(frame,imgsum);
- char testname[100];
- sprintf(testname,"%s%d%s","image",count,".jpg");
- cvShowImage(testname,frame);
- cvSaveImage(testname,frame);
- count++;
- }
- IplImage * imgavg = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3);
- cvConvertScale(imgsum,imgavg,1.0/4.0);
- cvShowImage("imageavg",imgavg);
- cvSaveImage("imageavg_4.jpg",imgavg);
- cvWaitKey(0);
- cvReleaseCapture(&capture);
- return 0;
- }
以下从左到右分别是连续两帧、四帧、八帧、十六帧求均值的结果:


实践:图像二次曝光
- //通过求平均二次曝光
- int main()
- {
- IplImage* image1= cvLoadImage("psu3.jpg");
- IplImage* image2= cvLoadImage("psu4.jpg");
- IplImage * imgsum =cvCreateImage(cvGetSize(image1),IPL_DEPTH_32F,3);
- cvZero(imgsum);
- cvAcc(image1,imgsum);
- cvAcc(image2,imgsum);
- IplImage * imgavg = cvCreateImage(cvGetSize(image1),IPL_DEPTH_8U,3);
- cvConvertScale(imgsum,imgavg,1.0/2.0);
- cvShowImage("imageavg",imgavg);
- cvSaveImage("avg.jpg",imgavg);
- cvWaitKey(0);
- cvReleaseImage(&image1);
- cvReleaseImage(&image2);
- cvReleaseImage(&imgsum);
- cvReleaseImage(&imgavg);
- return 0;
- }
下图是对同学街舞截图的“二次曝光”效果:

图像相减
- void cvAbsDiff(
- const CvArr* src1,//第一个输入数组
- const CvArr* src2,//第二个输入数组
- CvArr* dst//输出数组
- );
实践:减去背景
- //减去背景
- int main()
- {
- IplImage* pFrame = NULL;
- IplImage* pFrImg = NULL;
- IplImage* pBkImg = NULL;
- CvMat* pFrameMat = NULL;
- CvMat* pFrMat = NULL;
- CvMat* pBkMat = NULL;
- CvCapture* pCapture = NULL;
- int nFrmNum = 0;
- //创建窗口
- cvNamedWindow("video", 1);
- cvNamedWindow("background",1);
- cvNamedWindow("foreground",1);
- pCapture = cvCaptureFromFile("media.avi");
- while(pFrame = cvQueryFrame( pCapture ))
- {
- nFrmNum++;
- //如果是第一帧,需要申请内存,并初始化
- if(nFrmNum == 1)
- {
- pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);
- pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);
- pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
- pFrMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
- pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
- //转化成单通道图像再处理
- cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY);
- cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);
- cvConvert(pFrImg, pFrameMat);
- cvConvert(pFrImg, pFrMat);
- cvConvert(pFrImg, pBkMat);
- }
- else
- {
- cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);
- cvConvert(pFrImg, pFrameMat);
- //当前帧跟背景图相减
- cvAbsDiff(pFrameMat, pBkMat, pFrMat);
- //二值化前景图
- cvThreshold(pFrMat, pFrImg, 60, 255.0, CV_THRESH_BINARY);
- //更新背景
- cvRunningAvg(pFrameMat, pBkMat, 0.003, 0);
- //将背景转化为图像格式,用以显示
- cvConvert(pBkMat, pBkImg);
- cvShowImage("video", pFrame);
- cvShowImage("background", pBkImg);
- cvShowImage("foreground", pFrImg);
- if( cvWaitKey(2) >= 0 )
- break;
- }
- }
- cvDestroyWindow("video");
- cvDestroyWindow("background");
- cvDestroyWindow("foreground");
- cvReleaseImage(&pFrImg);
- cvReleaseImage(&pBkImg);
- cvReleaseMat(&pFrameMat);
- cvReleaseMat(&pFrMat);
- cvReleaseMat(&pBkMat);
- cvReleaseCapture(&pCapture);
- return 0;
- }
效果图:

转载请注明出处:http://blog.csdn.net/xiaowei_cqu/article/details/7610665
实验代码及视频下载:http://download.csdn.net/detail/xiaowei_cqu/4335573
【OpenCV】图像代数运算:平均值去噪,减去背景的更多相关文章
- opencv图像的基本操作3
1.获取像素并修改 读取一副图像,根据像素的行和列的坐标获取它的像素值,对于RGB图像而言,返回RGB的值,对于灰度图则返回灰度值 import cv2 import numpy img = cv2. ...
- OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
这篇已经写得很好,真心给作者点个赞.题目都是直接转过来的,直接去看吧. Reference Link : http://blog.csdn.net/poem_qianmo/article/detail ...
- 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...
- 学习 opencv---(12)OpenCV 图像金字塔:高斯金字塔,拉普拉斯金字塔与图片尺寸缩放
在这篇文章里,我们一起学习下 图像金字塔 的一些基本概念,如何使用OpenCV函数pyrUp和pyrDown 对图像进行向上和向下采样,以及了解专门用于缩放图像尺寸的resize函数的用法.此博文一共 ...
- opencv——图像遍历以及像素操作
摘要 我们在图像处理时经常会用到遍历图像像素点的方式,在OpenCV中一般有四种图像遍历的方式,在这里我们通过像素变换的点操作来实现对图像亮度和对比度的调整. 补充: 图像变换可以看成 像素变换--点 ...
- <学习opencv>图像和大型阵列类型
OPenCV /*=========================================================================*/ // 图像和大型阵列类型 /* ...
- Opencv 图像叠加 添加水印
Opencv 图像叠加 添加水印 C++: void Mat::copyTo(OutputArray m) const C++: void Mat::copyTo(OutputArray m, Inp ...
- opencv图像读取-imread
前言 图像的读取和保存一定要注意imread函数的各个参数及其意义,尽量不要使用默认参数,否则就像数据格式出现错误(here)一样,很难查找错误原因的: re: 1.opencv图像的读取与保存; 完
- [OpenCV Qt教程] 在Qt图形界面中显示OpenCV图像的OpenGL Widget(第二部分)
本文译自:http://www.robot-home.it/blog/en/software/tutorial-opencv-qt-opengl-widget-per-visualizzare-imm ...
随机推荐
- MySql数据库的主从配置
主服务器 192.168.7.182 Centos6.5 MYSQL5.6.10 从服务器 192.168.112.7 Centos6.5 MYSQL5.6.10 主服务器配置(192.168.7.1 ...
- hadoop 知识点总结
关于元数据的checkpoint 每隔一段时间,会由secondary namenode将namenode上积累的所有edits和一个最新的fsimage下载到本地,并加载到内存进行merge(这个过 ...
- 基于jetty镜像的ossfs镜像docker镜像构建
阿里云ossfs:https://help.aliyun.com/document_detail/32196.html?spm=5176.product31815.6.514.yVI0xM 以上是阿里 ...
- html div 加边框样式
边框虚线样式:dashed边框实现样式:solid border:1px dashed #000代表设置对象边框宽度为1px黑色虚线边框 border:1px solid #000代表设置对象边框宽度 ...
- nodejs mysql 创建连接池
用Nodejs连接MySQL 从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javas ...
- 写2个线程,一个打印1-52,一个打印A-Z,打印顺序是12A34B。。。(采用同步代码块和同步方法两种同步方法)
1.同步方法 package Synchronized; /************************************同步方法****************************** ...
- BZOJ 2111 [ZJOI2010]Perm 排列计数:Tree dp + Lucas定理
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2111 题意: 给定n,p,问你有多少个1到n的排列P,对于任意整数i∈[2,n]满足P[i ...
- svn更新时忽略指定文件或文件夹
选择一个收SVN控制的文件夹->右击->选择TortoiseSVN->更新至版本,就会出现 选择更新深度为工作副本,再选择项目,出现如图中所示的界面,把不想更新的文件或者文件夹前 ...
- 智课雅思词汇---十九、前缀se是什么意思
智课雅思词汇---十九.前缀se是什么意思 一.总结 一句话总结:前缀:se- 表示“分开, 离开, 区别开” 前缀:se- [词根含义]:分离 [同源单词]:secede, secession, s ...
- 《Advanced Bash-scripting Guide》学习(十五):测试坏的链接文件(broken link)
本文所选的例子来自于<Advanced Bash-scripting Gudie>一书,译者 杨春敏 黄毅 #/bin/bash #用一个纯粹的shell脚本来找出坏链接文件 #什么是br ...