【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
转载于:https://www.cnblogs.com/alan666/p/8312343.html
【OpenCV】图像代数运算:平均值去噪,减去背景相关推荐
- 图像代数运算:平均值去噪,减去背景
代数运算,就是对两幅图像的点之间进行加.减.乘.除的运算.四种运算相应的公式为: 代数运算中比较常用的是图像相加和相减.图像相加常用来求平均值去除addtive噪声或者实现二次曝光(double-ex ...
- cv2 inrange灰度图_基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析...
title: [python]基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析 type: categories copyright: true categories ...
- opencv 轮廓放大_基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析...
title: [python]基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析 type: categories copyright: true categories ...
- 学习使用非局部平均值去噪算法去除图像中的噪音-图像去噪
图像去噪 目标 • 学习使用非局部平均值去噪算法去除图像中的噪音 • 学习函数 cv2.fastNlMeansDenoising(),cv2.fastNlMeansDenoisingColored() ...
- OpenCV图像旋转,指定填充背景颜色边界颜色
OpenCV图像旋转,指定填充背景颜色边界颜色 OpenCV与图像旋转有关的函数: (1)warpAffine函数 void cv::warpAffine ( InputArray src, ...
- python使用openCV图像加载(转化为灰度图像)、平滑图像处理就是将每个像素的值变换为其相邻元素的平均值、可视化平滑处理之后的图像(Blurring Images)
python使用openCV图像加载(转化为灰度图像).平滑图像处理就是将每个像素的值变换为其相邻元素的平均值.可视化平滑处理之后的图像(Blurring Images) 目录
- 【笔记】opencv的python使用 腐蚀模糊背景分割等处理图像
概括 从概念上讲,一个字节能表示0到255的整数.目前,对于所有的实时图像应用而言, 虽然有其他的表示形式,但一个像素通常由每个通道的一个字节表示. 一个OpenCV图像是.array类型的二维或三维 ...
- opencv 图像与视频分析教程③
opencv 图像与视频分析教程 代码: https://github.com/bai1231/opencv-learn_and_pratice 二值图像分析 图像二值化 二值图像轮廓分析 霍夫检测 ...
- OpenCV图像锐化/增强
OpenCV图像锐化/增强 0.综述 1.Laplacian高通滤波算子 2.Laplacian锐化代码实践 3.USM锐化增强算法 4.USM代码实践 0.综述 图像的卷积计算除了可以完成我们前面介 ...
最新文章
- python操作word文档(python-docx)
- 第三方开始菜单软件使微软 Windows 10 升级时崩溃
- 网站压力测试工具webbench简介、安装、使用
- #1098 : 最小生成树二·Kruscal算法
- Simpleperf介绍
- 网易严选宣布退出双11?
- Java怎么不启动_dubbo不启动了怎么回事???一模一样的另一个没问题
- Portal-Basic Java Web应用开发框架V3.0正式发布(源码、实例及文档)
- python数据结构剑指offer-替换空格
- 架设WIN32汇编程序的开发环境
- 常用的107条Javascript
- python计算正弦值_Python科学计算(二)——正弦信号的时域波形与频谱图
- 计算机excel无法打开,双击Excel软件无法打开表格文件怎么办?
- 办公软件不能打印能打印测试页,在office办公软件word中不能打印是什么原因
- Laravel文档阅读笔记-Custom Authentication Login And Registration Using Laravel 8
- Educational Codeforces Round 91 (Rated for Div. 2) D.Berserk And Fireball(思维,暴力破解,分情况)
- JavaScript概述和HTML中嵌入JavaScript的三种方式
- matlab中cell是什么意思,matlab中cell的用法
- vlc插件详细使用说明
- 基于大数据分析的葡萄酒品质鉴别系统设计与实现
热门文章
- git stash 拉去_git操作命令符
- python规则网格插值_Python中规则网格上的插值
- linux mint 屏保_Linux Mint 修复了两个孩子发现的屏保锁定绕过漏洞
- vue weex 调用原生toast_vue-template-compiler 还能这么用
- 云服务器可以安装操作系统么,云服务器能装操作系统吗
- 按器件划分微型计算机是()计算机,计算机与信息技术概述(答案)
- android 停用应用的命令,免Root使用ADB命令_停用手机系统应用
- WifiP2pSettings工作流程
- Yolo(2)Yolo v2
- OpenCV(十二)漫水填充算法