当前位置: 首页 > 编程日记 > 正文

【OpenCV】图像代数运算:平均值去噪,减去背景

代数运算,就是对两幅图像的点之间进行加、减、乘、除的运算。四种运算相应的公式为:


代数运算中比较常用的是图像相加和相减。图像相加常用来求平均值去除addtive噪声或者实现二次曝光(double-exposure)。图像相减用于减去背景或周期噪声,污染等。

图像相加


OpenCV中提供了相加的函数
[cpp] view plaincopy
  1. void cvAcc(   
  2.            const CvArr* image,//输入图像  
  3.            CvArr* sum,  //累积图像   
  4.            const CvArr* mask=NULL//可选的运算  
  5.  );  
我们还需要用到一个线性变换转换函数来对相加的结果求平均
[cpp] view plaincopy
  1. void cvConvertScale(   
  2.         const CvArr* src, //输入数组  
  3.         CvArr* dst,//输出数组  
  4.         double scale=1,//比例  
  5.         double shift=0 //缩放比例,可选  
  6. );  
  7. #define cvCvtScale cvConvertScale  
  8. #define cvScale  cvConvertScale  
  9. #define cvConvert( src, dst )  cvConvertScale( (src), (dst), 1, 0 )  


实践:平均值去噪

我们用NASA的一段幸运团的视频做实验,截取视频的某几个连续帧求平均值:
[cpp] view plaincopy
  1. int main()  
  2. {  
  3.     CvCapture* capture=cvCaptureFromFile("media.avi");  
  4.     IplImage* frame=  NULL;  
  5.     IplImage * imgsum =NULL;  
  6.       
  7.     int start=301;  
  8.     int end=304;  
  9.     cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, start);  
  10.       
  11.     int count = start;  
  12.     while( cvGrabFrame(capture) && count <= end )  
  13.     {  
  14.         frame = cvRetrieveFrame(capture);// 获取当前帧  
  15.         if(imgsum==NULL){  
  16.             imgsum=cvCreateImage(cvGetSize(frame),IPL_DEPTH_32F,3);  
  17.             cvZero(imgsum);  
  18.         }  
  19.         cvAcc(frame,imgsum);  
  20.   
  21.         char testname[100];  
  22.         sprintf(testname,"%s%d%s","image",count,".jpg");  
  23.         cvShowImage(testname,frame);  
  24.         cvSaveImage(testname,frame);  
  25.           
  26.         count++;  
  27.     }  
  28.     IplImage * imgavg = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3);  
  29.     cvConvertScale(imgsum,imgavg,1.0/4.0);  
  30.       
  31.     cvShowImage("imageavg",imgavg);  
  32.     cvSaveImage("imageavg_4.jpg",imgavg);  
  33.       
  34.     cvWaitKey(0);  
  35.     cvReleaseCapture(&capture);  
  36.     return 0;  
  37. }  
以下从左到右分别是连续两帧、四帧、八帧、十六帧求均值的结果:
   

   


实践:图像二次曝光

曝光和去噪是一样的,也是对几幅图像求平均
[cpp] view plaincopy
  1. //通过求平均二次曝光  
  2. int main()  
  3. {  
  4.     IplImage* image1=  cvLoadImage("psu3.jpg");  
  5.     IplImage* image2=  cvLoadImage("psu4.jpg");  
  6.       
  7.     IplImage * imgsum =cvCreateImage(cvGetSize(image1),IPL_DEPTH_32F,3);  
  8.     cvZero(imgsum);  
  9.     cvAcc(image1,imgsum);  
  10.     cvAcc(image2,imgsum);  
  11.   
  12.     IplImage * imgavg = cvCreateImage(cvGetSize(image1),IPL_DEPTH_8U,3);  
  13.     cvConvertScale(imgsum,imgavg,1.0/2.0);  
  14.   
  15.     cvShowImage("imageavg",imgavg);  
  16.     cvSaveImage("avg.jpg",imgavg);  
  17.   
  18.     cvWaitKey(0);  
  19.     cvReleaseImage(&image1);  
  20.     cvReleaseImage(&image2);  
  21.     cvReleaseImage(&imgsum);  
  22.     cvReleaseImage(&imgavg);  
  23.     return 0;  
  24. }  
下图是对同学街舞截图的“二次曝光”效果:


图像相减


OpenCV中用cvAbsDiff函数计算两数组的差的绝对值
[cpp] view plaincopy
  1. void cvAbsDiff(   
  2.         const CvArr* src1,//第一个输入数组  
  3.         const CvArr* src2,//第二个输入数组  
  4.         CvArr* dst//输出数组  
  5. );  


实践:减去背景

减去背景是通过两幅图像代数相减,可以判断出前景区域和运动区域,这是最简单(很多时候也是效果很好的)运动检测方法。
[cpp] view plaincopy
  1. //减去背景  
  2. int main()  
  3. {  
  4.     IplImage* pFrame = NULL;   
  5.     IplImage* pFrImg = NULL;  
  6.     IplImage* pBkImg = NULL;  
  7.   
  8.     CvMat* pFrameMat = NULL;  
  9.     CvMat* pFrMat = NULL;  
  10.     CvMat* pBkMat = NULL;  
  11.   
  12.     CvCapture* pCapture = NULL;  
  13.   
  14.     int nFrmNum = 0;  
  15.   
  16.     //创建窗口  
  17.     cvNamedWindow("video", 1);  
  18.     cvNamedWindow("background",1);  
  19.     cvNamedWindow("foreground",1);  
  20.   
  21.     pCapture = cvCaptureFromFile("media.avi");  
  22.     while(pFrame = cvQueryFrame( pCapture ))  
  23.     {  
  24.         nFrmNum++;  
  25.   
  26.         //如果是第一帧,需要申请内存,并初始化  
  27.         if(nFrmNum == 1)  
  28.         {  
  29.             pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),  IPL_DEPTH_8U,1);  
  30.             pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),  IPL_DEPTH_8U,1);  
  31.   
  32.             pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);  
  33.             pFrMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);  
  34.             pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);  
  35.   
  36.             //转化成单通道图像再处理  
  37.             cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY);  
  38.             cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);  
  39.   
  40.             cvConvert(pFrImg, pFrameMat);  
  41.             cvConvert(pFrImg, pFrMat);  
  42.             cvConvert(pFrImg, pBkMat);  
  43.         }  
  44.         else  
  45.         {  
  46.             cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);  
  47.             cvConvert(pFrImg, pFrameMat);  
  48.             //当前帧跟背景图相减  
  49.             cvAbsDiff(pFrameMat, pBkMat, pFrMat);  
  50.             //二值化前景图  
  51.             cvThreshold(pFrMat, pFrImg, 60, 255.0, CV_THRESH_BINARY);  
  52.             //更新背景  
  53.             cvRunningAvg(pFrameMat, pBkMat, 0.003, 0);  
  54.             //将背景转化为图像格式,用以显示  
  55.             cvConvert(pBkMat, pBkImg);  
  56.   
  57.             cvShowImage("video", pFrame);  
  58.             cvShowImage("background", pBkImg);  
  59.             cvShowImage("foreground", pFrImg);  
  60.   
  61.             if( cvWaitKey(2) >= 0 )  
  62.                 break;  
  63.         }  
  64.     }  
  65.     cvDestroyWindow("video");  
  66.     cvDestroyWindow("background");  
  67.     cvDestroyWindow("foreground");  
  68.     cvReleaseImage(&pFrImg);  
  69.     cvReleaseImage(&pBkImg);  
  70.     cvReleaseMat(&pFrameMat);  
  71.     cvReleaseMat(&pFrMat);  
  72.     cvReleaseMat(&pBkMat);  
  73.     cvReleaseCapture(&pCapture);  
  74.     return 0;  
  75. }  
效果图:

转载请注明出处: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

相关文章:

简明 Vim 练级攻略(转)

vim的学习曲线相当的大&#xff08;参看各种文本编辑器的学习曲线&#xff09;&#xff0c;所以&#xff0c;如果你一开始看到的是一大堆VIM的命令分类&#xff0c;你一定会对这个编辑器失去兴趣的。下面的文章翻译自《Learn Vim Progressively》&#xff0c;我觉得这是给新手最…

iOS 的离屏渲染

原文链接&#xff1a;http://www.imlifengfeng.com/blog/?p593OpenGL ES 是一套多功能开放标准的用于嵌入系统的 C-based 的图形库&#xff0c;用于 2D 和 3D 数据的可视化。OpenGL 被设计用来转换一组图形调用功能到底层图形硬件&#xff08;GPU&#xff09;&#xff0c;由 G…

MySQL 常见操作指令

什么是SQL&#xff1f; SQL&#xff08;Structured Query Language&#xff09;用于访问和操作数据库的结构化查询语言。 数据库包含一个或多个表&#xff0c;每个表均有名称标识&#xff0c;包含数据的记录&#xff08;行&#xff09;。 典型的SQL语句 1. SELEC语句 SELE…

iOS 实现点击微信头像效果

来源&#xff1a;伯乐在线 - 小良 如有好文章投稿&#xff0c;请点击 → 这里了解详情 如需转载&#xff0c;发送「转载」二字查看说明 公司产品需要实现点击个人主页头像可以放大头像、缩放头像、保存头像效果&#xff08;和点击微信个人头像类似&#xff09;&#xff0c;故找…

HDU 4292 Food(dinic +拆点)

题目链接 我做的伤心了&#xff0c;不知是模版效率低&#xff0c;还是错了&#xff0c;交上就是TLE&#xff0c;找了份别人的代码&#xff0c;改了好几下终于过了。。 1 #include <cstdio>2 #include <cstring>3 #include <queue>4 #include <map>5 #i…

jQuery中用ajax访问php接口文件

js代码 function ajax_request(){var result;var articleId new Object();articleIdgetArticleId();$.ajax({url: "/topicPage/getComment.php",//请求php文件的路径data:{id:articleId},//请求中要传送的参数,会自动拼接成一个路径&#xff0c;在php中用get方式获取…

Python 数据库操作 psycopg2

文章目录安装基本使用安装 psycopg 是 Python 语言中 PostpreSQL数据库接口 安装环境&#xff1a; Python&#xff1a;v2.7, v3.4~3.8PostGreSQL&#xff1a;7.4~12 pip install psycopg2基本使用 import psycopg2def connect_db(host: str,port: int,database: str,user:…

Android logcat命令详解

一、logcat命令介绍 1.android log系统 2.logcat介绍 logcat是android中的一个命令行工具&#xff0c;可以用于得到程序的log信息 log类是一个日志类&#xff0c;可以在代码中使用logcat打印出消息 常见的日志纪录方法包括&#xff1a;方法 描述 v(String,String) (vervbose)显…

[iOS]如何重新架构 JPVideoPlayer ?

注意&#xff1a;此文为配合 JPVideoPlayer version 2.0 版本发布而写&#xff0c;如果你想了解 2.0 版本的更新内容和所有实现细节&#xff0c;请点击前往 GitHub。 导言&#xff1a;我几个月前写了一个在 UITableView 中滑动 UITableViewCell 播放视频的框架&#xff0c;类似…

函数项目一个超感人的故事:关于swfupload在某些环境下面session丢失的完美解决方案(看完我哭了)...

查了好多资料&#xff0c;发现还是不全&#xff0c;干脆自己整理吧&#xff0c;至少保证在我的做法正确的&#xff0c;以免误导读者&#xff0c;也是给自己做个记录吧&#xff01; 标题吸引到你了吗&#xff1f; 先说一下这个题问成形的原因。大家都晓得 session是靠cookie中的…

【学习笔记】git 使用文档

安装 git # mac 环境 brew install git检查是否安装成功 ➜ ~ git --version git version 2.20.1 (Apple Git-117)卸载 git ➜ ~ which -a git /usr/bin/git ➜ ~ cd /usr/bin ➜ bin sudo rm -rf git*git init 命令 对一个空文件&#xff0c;git 初始化。文件名称增加…

UIBezierPath和CAShapeLayer创建不规则View(Swift 3.0)

最近一个朋友在做图片处理的 App&#xff0c;想要实现类似 MOLDIV App 拼图的UI效果&#xff08;如何创建不规则的 view&#xff09;&#xff0c;就问我有什么想法。我首先想到的就是 UIBezierPathCAShapeLayer的方式&#xff0c;为了验证自己的想法&#xff0c;写了一个小 dem…

http响应状态

Servlet API&#xff1a; javax.servlet.http.HttpServletResponse 用于创建HTTP响应&#xff0c;包括HTTP协议的状态行、响应头以及消息体 HTTP状态码&#xff1a; 100-199&#xff1a;表示信息性代码&#xff0c;标示客户端应该采取的其他动作&#xff0c;请求正在进行。 200…

antlr.collections.AST.getLine()I问题的起因及解决

在我们的java web 项目中引入hibernate和struts&#xff0c;当我们使用HQL语句进行查询时会报 antlr.collections.AST.getLine()I的错误&#xff0c;导致程序无法继续运行&#xff0c;这并不是我们的程序写的有错误&#xff0c;出现这个异常的原因是因为我们使用的hibernate和s…

2018湖湘杯海选复赛Writeup

2018湖湘杯Writeup0x01 签到题0x02 MISC Flow0x03 WEB Code Check0x04 WEB Readflag0x05 WEB XmeO0x06 Reverse Replace0x07 MISC Disk0x08 Crypto Common Crypto0x09 Reverse HighwayHash640x10 Web Mynot0x01 签到题 关注合天智汇公众号&#xff0c;回复hxb2018得到flag。0x…

Operation Queues并发编程

并发、异步在我们的编程中&#xff0c;见到的太多了。在iOS中&#xff0c;实现并发的主要三个途径Operation Queues、Dispatch Queues、Dispatch Sources&#xff0c;今天我们就来详细介绍Operatin Queues的使用&#xff0c;花了两天时间写这一篇&#xff0c;值得一看。 为什么…

socket 服务器浏览器与服务器客户端实例

一、服务器与浏览器 // 取得本机的loopback网络地址&#xff0c;即127.0.0.1 IPAddress address IPAddress.Loopback; IPEndPoint endPoint new IPEndPoint(address, 49152); Socket socket new Socket(AddressFamily.InterNetwork, Socke…

匹配3位或4位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔...

public bool IsPhone(string input){string pattern "^\\(0\\d{2}\\)[- ]?\\d{8}$|^0\\d{2}[- ]?\\d{8}$|^\\(0\\d{3}\\)[- ]?\\d{7}$|^0\\d{3}[- ]?\\d{7}$";Regex regex new Regex(pattern);return regex.IsMatch(input);} 转载于:https://www.cnblogs.com/…

Mac MySQL配置环境变量的两种方法

第一种&#xff1a; 1.打开终端,输入&#xff1a; cd ~ 会进入~文件夹 2.然后输入&#xff1a;touch .bash_profile 回车执行后&#xff0c; 3.再输入&#xff1a;open -e .bash_profile 会在TextEdit中打开这个文件&#xff08;如果以前没有配置过环境变量&#xff0c;那么这…

linux之x86裁剪移植---字符界面sdl开发入门

linux下有没有TurboC2.0那样的画点、线、圆的图形函数库&#xff0c;有没有grapihcs.h&#xff0c;或者与之相对应或相似的函数库是什么&#xff1f;有没有DirectX这样的游戏开发库&#xff1f;SDL就是其中之一。SDL&#xff08;Simple DirectMedia Layer&#xff09;是一个夸平…

iOS 视频捕获系列Swift之AVFoundation(一)

iOS 视频捕获系列之AVFoundation(一) AVCaptureMovieFileOutput系列 在iOS开发过程中&#xff0c;或多或少的都涉及视频的操作。 尤其在去年直播行业的带动下&#xff0c;移动端对视频的处理也愈来愈发要求严格。 本文也是在 这篇 中参考而来。 Swift 版本哦&#xff01; 本文 …

C#做外挂常用API

using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; //这个肯定要的 namespace WindowsApplication1 {class win32API{public const int OPEN_PROCESS_ALL 2035711;public const int PAGE_READWRITE 4;public con…

phpinfo 信息利用

0x01 基础信息 1.system info:提供详细的操作系统信息&#xff0c;为提权做准备。 2.extension_dir:php扩展的路径 3.$_SERVER[‘HTTP_HOST’]:网站真实IP、CDN什么的都不存在的&#xff0c;找到真实ip&#xff0c;扫一扫旁站&#xff0c;没准就拿下几个站。 4.$_SERVER[‘…

iOS三种录制视频方式详细对比

先附上参考资料 http://www.jianshu.com/p/16cb14f53933 https://developer.apple.com/library/content/samplecode/AVSimpleEditoriOS/Introduction/Intro.html https://github.com/objcio/VideoCaptureDemo https://github.com/gsixxxx/DTSmallVideo https://github.com/Andy…

C# 实现Oracle中的数据与Excel之间的转换

最近项目要求实现数据库之间数据在各个数据库之间导入导出&#xff0c;在此做个笔记 1. 将Oracle中的表导入到Excel中&#xff0c;反之亦然 private static readonly string connectionString ConfigurationManager.ConnectionStrings["OracleConnection"].Connecti…

【转】Word2007中不连续页码设置 多种页码设置

【转】Word2007中不连续页码设置 多种页码设置 页码是论文必不可少的部分。我们看一下如何添加页码&#xff0c;并且针对一些特殊的格式要求怎么应对&#xff1a; 如果是【毕业论文】有多种混合页码&#xff0c;有Ⅰ、Ⅱ、Ⅲ。。。还有1、2、3 。。。请直接看【第二种方法】。 …

vim编辑器异常退出产生备份文件

当非正常关闭vim编辑器时&#xff08;比如直接关闭终端或者电脑断电&#xff09;&#xff0c;会生成一个.swp文件&#xff0c;这个文件是一个临时交换文件&#xff0c;用来备份缓冲区中的内容。 需要注意的是如果你并没有对文件进行修改&#xff0c;而只是读取文件&#xff0c…

从0到1思考与实现iOS-Widget

讲述之前首先看下demo效果图&#xff1a; 基本的展开收起、本App本体交互然后再展示几个效果不错的 Widget app 毒物 && KeepESPNPCalcMusixmatchFantastical 2Carrot Weatherdemo 地址在此&#xff01;欢迎star 比心一、Widget总览 Widget 是 iOS8 推出第一版&…

Android Studio 初体验

Google在I/O2013大会上发布了Android新的开发工具Android Studio&#xff0c;趁周末时间做了一下尝试。有需要的可以在http://developer.android.com/sdk/installing/studio.html下载&#xff0c;当前版本是V0.1。官方解释&#xff1a;Android Studio is anew Android developm…

JAVA面试题(2)

1 String 与 new 的不同 使用“”赋值不一定每次都创建一个新的字符串&#xff0c;而是从“字符串实例池”中查找字符串。使用“new”进行赋值&#xff0c;则每次都创建一个新的字符串。 2 String与StringBuffer String类是不可变类&#xff0c;字符串一旦初始化后&#xff0c…